c# - System.Timers.Timer 以 1000 毫秒间隔在同步、单帧 (<16 毫秒) 函数上重叠;为什么会这样?
问题描述
我确定这是我的错,因为我在网上完全没有找到关于此的资源。在我的特殊情况下,我需要一个计时器来重复并每 1 秒(1000 毫秒)调用一次函数。如果变量为 0,则它应该结束计时器。
我发现如果 Timer.Stop() || Timer.enabled = false 在函数的末尾,它不会执行,而是似乎被定时器执行的第二次迭代中断。
这是与计时器及其函数有关的所有相关代码,请注意它们可能来自不同的类(如来自 Health.cs 的 RefreshInjuries 的情况):
{
HealTimer = new Timer(1000);
HealTimer.Elapsed += AdvanceHeal;
HealTimer.AutoReset = true;
HealTimer.Enabled = true;
}
public void AdvanceHeal(object _, ElapsedEventArgs __)
{
//lock (this)
//{
float RestModifier = CharacterHealth.RestHealModifier;
float TendModifier = Tended ? (1f / MaxTendDurationReduction - 1f) * TendQuality + 1f : 1f;
float ModifiedTotal = 1f * RestModifier * TendModifier;
EffectiveRemainingTime = RemainingTime / ModifiedTotal;
RemainingTime -= ModifiedTotal;
if (RemainingTime <= 0f)
{
HealInjury();
}
// }
}
public void HealInjury()
{
HealTimer.Enabled = false;
Part.Injuries.Remove(this);
CharacterHealth.InjuryCount--;
CharacterHealth.InjuryCostSum -= SeverityCost;
CharacterHealth.RefreshInjuries();
//If HealTimer.Enabled = false; is here, it will not run
}
public void RefreshInjuries()
{
if (InjuriesChanged == null) return;
InjuriesChanged.Invoke();
}
解决方案
您是否尝试过将您的方法定义为异步方法?这将有助于异步执行任务,而不会中断其他正在运行的任务。你可以在这里阅读更多关于它的信息
public async void AdvanceHeal(object _, ElapsedEventArgs __)
{
await Task.Run(() =>
{
//your codes here..
});
}
我在当前任务中遇到了同样的问题。我使用的一种方法阻止了另一种导致我的应用程序崩溃的方法。这种方法帮助了我。
推荐阅读
- php - json图像上传测试并从android恢复图像
- apache-flink - Apacheflink 的 DataStream API 如何支持事件的批处理
- javascript - 有没有办法避免这段代码中的嵌套循环?
- flutter - 如何在 SingleChildScrollView 内的列内居中小部件
- javascript - 如何实现考虑到用户拼写错误的过滤器?
- python - 是否可以从 .py 文件启动 Anaconda Prompt?
- websocket - 如何将 Web 应用程序连接到 gamefleet 实例?
- python - 如何在python随机模块中获取未选择的人口
- java - 将对象列表转换为 Map
> 使用流 - kubernetes - 在 GKE 中使用 FrontendConfig 进行 HTTP 到 HTTPS 重定向