У меня есть System.Threading.Timer, который вызывает соответствующий обработчик события (callback) каждый 10 мс. Сам метод не реентеративен и иногда может принимать путь дольше 10 мс. Таким образом, я хочу остановить таймер во время выполнения метода.
код:
private Timer _creatorTimer;
// BackgroundWorker 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 заявляет, что вызывается метод обратного вызова (каждый раз, когда таймер срабатывает) в отдельном потоке из пула потоков. Это означает, что если я остановлю таймер, первое, что нужно сделать в методе, оно по-прежнему не предотвратит запуск таймера и запуск другого экземпляра метода до того, как первый из них сможет остановить таймер.
Может ли быть заблокирован таймер (или даже сам нерентерентный метод)? Каков правильный способ избежать срабатывания таймера во время выполнения его метода обратного вызова (и не реентерабельного)?