Удалите функцию 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(). Какой смысл делать это? Вам действительно нужно ждать? Если так, то почему?

Другие вопросы по тегам