.Net:如何等待System.Timers.Timer停止

时间:2016-06-28 06:17:03

标签: c# .net timer

我在主线程中创建了一个System.Timers.Timer实例。现在我调用timer.Stop()来尝试终止该时间,并希望等到计时器真正终止。我怎么能这样做?

是否有类似System.Threading.Thread.Join()的方法?

以下是一些代码

//the main thread:
var aTimer = New Timer();
aTimer.Elapsed += SomeTimerTask;
aTimer.AutoReset = True;
aTimer.Start();

//some other logic...

//stop that timer:
aTimer.Stop();

//now I need to wait until that timer is really stopped,
//but I cannot touch the method SomeTimerTask().
//so I need something like System.Threading.Thread.Join()...

2 个答案:

答案 0 :(得分:1)

您可以使用一个ResetEvents,它是可以阻塞线程的等待句柄,直到您将状态设置为已发出信号:

class TimerAndWait
{
    private ManualResetEvent resetEvent = new ManualResetEvent(false);

    public void DoWork()
    {
        var aTimer = new System.Timers.Timer(5000);
        aTimer.Elapsed += SomeTimerTask;
        aTimer.Elapsed += ATimer_Elapsed;
        aTimer.AutoReset = true;
        aTimer.Start();

        // Do something else

        resetEvent.WaitOne(); // This blocks the thread until resetEvent is set
        resetEvent.Close();
        aTimer.Stop();
    }

    private void ATimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        resetEvent.Set();
    }
}

如果您需要基于异步/任务的解决方案,则必须使用ThreadPool.RegisterWaitForSingleObject方法

答案 1 :(得分:0)

当您拨打停止时,定时器无法启动Elapsed,因为您可以在Stop()的{​​{3}}中阅读 - 方法:

  

通过将Enabled设置为false来停止提升Elapsed事件。

经过 - 活动仅在Timer s Enabled - 属性设置为true且给定Interval时触发已经过了(这可能会多次发生)。

因此,如果在Interval过去之前停止Timer,则可能必须以其他方式触发代码。