我有一个计时器(System.Timers.Timer),每100毫秒触发一次。
我向计时器订阅了一个事件处理程序,它可以正常工作:
public override void TimerEvent(object source, ElapsedEventArgs e)
{
lock (timerlock)
{
Timer.Stop();
...
Timer.Start();
}
}
我使用了定时器锁,因此当我取消订阅定时器时,可以确定自己不在TimerEvent方法的中间。
因此,当我想退订计时器时,请执行以下操作:
lock (timerlock)
{
Timer.Elapsed -= TimerEvent;
}
try
{
DoSomethingThatTakesUpToAMinute();
}
catch (Exception ex)
{
MessageBox.Show("...");
}
finally
{
Timer.Elapsed += TimerEvent;
}
但是,当我在finally块中再次订阅Timer时,我的程序将花费15秒,直到下一个Timer Event被注册为止,即使已经执行了finally。请注意,我在取消订阅和重新订阅计时器之间所做的事情可能要花费一分钟。
我可以在控制台中看到,在finally块之后,大约有5个线程以错误代码0结尾,一旦它们全部结束,我的TimerEvents就会再次被触发。
有什么想法吗?