我有一个使用定时器的类。此类实现 IDispose
。我想在 Dispose
方法中等待,直到计时器不再触发。
我是这样实现的:
private void TimerElapsed(object state)
{
// do not execute the callback if one callback is still executing
if (Interlocked.Exchange(ref _timerIsExecuting, 1) == 1)
return;
try
{
_callback();
}
finally
{
Interlocked.Exchange(ref _timerIsExecuting, 0);
}
}
public void Dispose()
{
if (Interlocked.Exchange(ref _isDisposing, 1) == 1)
return;
_timer.Dispose();
// wait until the callback is not executing anymore, if it was
while (_timerIsExecuting == 0)
{ }
_callback = null;
}
这个实现是否正确?我认为这主要取决于_timerIsExecuting == 0
是否是原子操作的问题。或者我必须使用 WaitHandle
。对我来说,这似乎会使代码变得不必要的复杂......
我不是多线程方面的专家,所以很乐意接受任何建议。
最佳答案
除非你有理由不使用 System.Threading.Timer
这有一个 Dispose
带有等待句柄的方法
你可以这样做,
private readonly Timer Timer;
private readonly ManualResetEvent TimerDisposed;
public Constructor()
{
Timer = ....;
TimerDisposed = new ManualResetEvent(false);
}
public void Dispose()
{
Timer.Dispose(TimerDisposed);
TimerDisposed.WaitOne();
TimerDisposed.Dispose();
}
关于c# System.Threading.Timer 等待处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13396440/