我在主线程中创建了一个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()...
答案 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,则可能必须以其他方式触发代码。