繁体   English   中英

停止计时器并防止发生经过的事件

[英]Stopping A Timer And Preventing The Elapsed Event To Fire

从MSDN:

在ThreadPool线程上引发Timer.Elapsed事件,因此事件处理方法可能在一个线程上运行,而对Timer.Stop方法的调用在另一个线程上运行。 这可能导致在调用Stop方法之后引发Elapsed事件。

我有一个运行特定时间的计时器,然后经过并设置一个标志。 有时我想停止计时器并重新启动它。

当前,当我尝试停止计时器时,经过的事件仍然会触发(有时),因此,当我不希望它发生时,将设置我的标志。

如何停止标记,并确保经过的事件不会触发?

**编辑**

在事件处理程序中,我尝试在运行代码之前检查计时器的状态以确保其状态已启用,并且还尝试在停止计时器时设置标志,并在运行代码之前检查该标志。

都不起作用

        Timer t = new Timer(4000);
        t.Elapsed += t_Elapsed;
        t.Stop();
        t.Dispose();

最后一行将删除计时器,因此不会发生经过的事件。

如果在调用stop和dispose时计时器已经在执行过去的函数,则执行将完成。

我也多次遇到类似的问题。

//Timer init.
 var _timer = new System.Timers.Timer
{
    AutoReset = true, 
    Enabled = true,
    Interval = TimeSpan.FromSeconds(15).TotalMilliseconds //15 seconds interval
};
 _timer.Elapsed += DoSomethingOnTimerElapsed;


//To be called on timer elapsed.
private void DoSomethingOnTimerElapsed(object source, ElapsedEventArgs e)
{
    //Disable timer.
    _timer.Enabled = false; //or _timer.Stop()
    var markers = new Dictionary<string, ConversationItem>();
    try
    {
        //does long running process
    }
    catch (Exception ex)
    {

    }
    finally
    {
        if (_shouldEnableTimer) //set its default value to true.
            _timer.Enabled = true; //or _timer.Start()
    }
}


//somewhere in the code if you want to stop timer:
_timer.Enabled = _shouldEnableTimer = false;

//At any point, if you want to resume timer add this:
_timer.Enabled = _shouldEnableTimer = true;

为什么要这样做?

假设try块中的代码花费更多时间。 因此,当您禁用计时器时(_timer.Enabled = false or _timer.Stop()) ,很有可能try块中的代码仍在执行。 因此,在完成最后的任务后,如果没有标志( _shouldEnableTimer )检查,则会再次启用它。 因此,我通过添加其他标志检查来防止出现您的问题。

为了更清晰,请遍历代码和添加的注释。 希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM