C# 计时器在停止后仍然运行得更多一点

本文关键字:运行 多一点 计时器 | 更新日期: 2023-09-27 18:34:19

我正在使用Windows表单。我正在使用System.Timers.Timer.虽然我用timer.Stop()停止了计时器,但它仍然多了一点点。我放了一些布尔变量来防止这种情况,但没有运气。有人知道吗?谢谢。

            timer = new System.Timers.Timer();
            timer.Elapsed += OnTimedEvent;
            timer.Interval = 1000;
            timer.start();
public void cancelConnectingSituation(Boolean result)
        {
            connecting = false;
            timer.Stop();
            if (result)
            {
                amountLabel.Text = "Connected";
            } 
            else
            {
                amountLabel.Text = "Connection fail";
            }
        }

private void OnTimedEvent(Object source, ElapsedEventArgs e)
        {
            if (device.position == 2 && connecting)
            {
                refreshTime();
                setConnectingText();
            }
            else if (connecting)
            {
                setConnectingText();
            }
            else
            {
                refreshTimeAndAmount();
            }
        }

C# 计时器在停止后仍然运行得更多一点

触发System.Timers.Timer Elapsed事件时,它会在后台ThreadPool线程上触发。这意味着,当您调用 Stop 时,事件可能已经触发,并且此线程正在排队等待执行。

如果要确保事件在停止计时器后不会触发,则需要(除了布尔变量之外)一个锁:

 readonly object _lock = new object();
 volatile bool _stopped = false;
 void Stop()
 {
     lock (_lock)
     {
         _stopped = true;
         _timer.Stop();
     }
 }
 void Timer_Elapsed(...) 
 {
     lock (_lock)
     {
         if (_stopped)
             return;
         // do stuff
     }
 }

或者,更简单:

 readonly object _lock = new object();
 void Stop()
 {
     lock (_lock)
     {
         _timer.Enabled = false; // equivalent to calling Stop()
     }
 }
 void Timer_Elapsed(...) 
 {
     lock (_lock)
     {
         if (!_timer.Enabled)
             return;
         // do stuff
     }
 }