C#Timer经过停止后仍然运行一点点

时间:2016-02-11 21:03:57

标签: c# timer

我正在使用Windows窗体。我正在使用System.Timers.Timer。虽然我用timer.Stop()停止了计时器,但它仍然会更多。我放了一些bool变量来防止这个,但没有运气。有人知道吗? 谢谢。

            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();
            }
        }

1 个答案:

答案 0 :(得分:5)

当触发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
     }
 }