我有一个 System.Threading.Timer,它每 10 毫秒 调用一次其相应的事件处理程序(回调)。该方法本身是 非可重入 的,有时可能需要比 10 毫秒 更长的时间才能完成。因此,在方法执行期间,我想停止计时器。
代码:
private Timer _creatorTimer;
// BackgroundWorker's work
private void CreatorWork(object sender, DoWorkEventArgs e) {
_creatorTimer = new Timer(CreatorLoop, null, 0, 10);
// some other code that worker is doing while the timer is active
// ...
// ...
}
private void CreatorLoop(object state) {
// Stop timer (prevent reentering)
_creatorTimer.Change(Timeout.Infinite, 0);
/*
... Work here
*/
// Reenable timer
_creatorTimer.Change(10, 0);
}
MSDN指出,回调方法在来自线程池的单独线程中调用(每次计时器触发)。这意味着,如果我在方法中首先停止计时器,它仍然不一定能够阻止计时器在第一个实例有机会停止计时器之前运行另一个方法实例。
也许应该锁定计时器(或甚至是非可重入方法)?如何正确地防止计时器在执行其回调(和非可重入)方法期间触发?