Удалите функцию WaitOne застрял таймер обратного вызова
У меня есть таймер, что это обратный вызов сделать что-то:
Таймер:
dataProcessingTimer = new System.Threading.Timer(new TimerCallback(DataProcessingTimerHandler), null, 0, _dataProcessingTimerPollingInterval);
Обратный звонок:
void DataProcessingTimerHandler(object param)
{
// some code.. (sometimes the stop function called from here).
}
Когда я хочу остановить таймер, я вызвал свою функцию остановки:
public void Stop()
{
if (_dataProcessingTimer != null)
{
ManualResetEvent timerDisposeHandler = new ManualResetEvent(false);
_dataProcessingTimer.Dispose(timerDisposeHandler);
_dataProcessingTimer = null;
timerDisposeHandler.WaitOne();
}
}
timerDisposeHandler.WaitOne();
обязательно используйте утилизацию перед кодом, который следует за функцией остановки.
Но иногда, когда функция остановки вызывается в середине обратного вызова, ожидание застревает все.
Кажется, что WaitOne застрял обратный вызов, но я не понимаю, почему это происходит, разве обратный вызов таймера не найден в своем собственном потоке? почему нить функции остановки должна застрять?
Я был бы рад, если бы кто-то мог объяснить мне ситуацию и дать мне решение.
1 ответ
Вы блокируете обратный вызов таймера. Из MSDN: "Таймер не удаляется, пока не завершены все текущие обратные вызовы в очереди".
Другими словами, класс System.Threading.Timer не будет располагаться, пока ваш обратный вызов не завершится. Но ваш обратный вызов не завершается до тех пор, пока не вернется метод Stop(). И метод Stop() отказывается возвращаться, пока утилизация не завершена.
Если вам действительно нужно подождать, чтобы получить уведомление о завершении утилизации, у вас есть две возможности: отложить вызов Stop() до завершения обратного вызова; или отложить ожидание до завершения обратного вызова. Что вы не можете сделать, так это пытаться ждать внутри того же метода, который блокирует ожидаемое событие.
ИМХО, лучшее решение - просто не ждать завершения Dispose(). Какой смысл делать это? Вам действительно нужно ждать? Если так, то почему?