首页 > 解决方案 > 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();
    }

标签: c#timer

解决方案


您是否尝试过将您的方法定义为异步方法?这将有助于异步执行任务,而不会中断其他正在运行的任务。你可以在这里阅读更多关于它的信息

public async void AdvanceHeal(object _, ElapsedEventArgs __)
{
   await Task.Run(() =>
   {
      //your codes here..
   });
}

我在当前任务中遇到了同样的问题。我使用的一种方法阻止了另一种导致我的应用程序崩溃的方法。这种方法帮助了我。


推荐阅读