我有一个用 C# 实现的 Windows 服务,它需要经常做一些工作。我已经使用System.Threading.Timer
一个回调方法实现了这一点,该方法负责安排下一个回调。我无法优雅地停止(即处置)计时器。这是一些可以在控制台应用程序中运行的简化代码,可以说明我的问题:
const int tickInterval = 1000; // one second
timer = new Timer( state => {
// simulate some work that takes ten seconds
Thread.Sleep( tickInterval * 10 );
// when the work is done, schedule the next callback in one second
timer.Change( tickInterval, Timeout.Infinite );
},
null,
tickInterval, // first callback in one second
Timeout.Infinite );
// simulate the Windows Service happily running for a while before the user tells it to stop
Thread.Sleep( tickInterval * 3 );
// try to gracefully dispose the timer while a callback is in progress
var waitHandle = new ManualResetEvent( false );
timer.Dispose( waitHandle );
waitHandle.WaitOne();
问题是我在阻塞时ObjectDisposedException
从timer.Change
回调线程上得到一个。waitHandle.WaitOne
我究竟做错了什么?
Dispose
我正在使用的重载文档说:
在所有当前排队的回调完成之前,不会释放计时器。
编辑:看来文档中的此声明可能不正确。有人可以验证吗?
我知道我可以通过在回调和处置代码之间添加一些信号来解决这个问题,正如 Henk Holterman 下面建议的那样,但除非绝对必要,否则我不想这样做。