【发布时间】:2012-11-15 11:18:28
【问题描述】:
我有一个使用定时器的类。此类实现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。对我来说,这似乎会使代码变得不必要地复杂......
我不是多线程方面的专家,所以我很乐意听取任何建议。
【问题讨论】:
-
我正在开发一个 ASP.NET 应用程序。计时器在 HttpApplication 的 Dispose 调用上被释放。原因:回调可以访问日志系统。所以我必须确保在处理日志系统之前处理计时器。
-
@LMB 当然,如果一个方法有一个
IDisposable,你就丢弃它。是的,GC可以清理,但如果这足够有效,为什么还要使用IDisposable? -
@MAfifi 当你使用非托管资源时。
标签: c# multithreading timer dispose