【发布时间】:2010-12-14 13:07:57
【问题描述】:
我有一个 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 声明回调方法在与线程池不同的线程中被调用(每次定时器触发)。这意味着,如果我在方法中的第一件事中停止计时器,它仍然不一定会阻止计时器触发并在第一个有机会停止计时器之前运行该方法的另一个实例。
是否应该锁定计时器(甚至是不可重入方法本身)? 在执行其回调(和不可重入)方法期间防止计时器触发的正确方法是什么?
【问题讨论】:
标签: c# callback timer reentrancy