Dispose WaitOne函数卡住了计时器回调

本文关键字:计时器 回调 WaitOne 函数 Dispose | 更新日期: 2023-09-27 18:27:10

我有一个计时器,它正在回调做某事:

计时器:

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();用于确保在停止函数后面的代码之前完成处理。

但有时在回调的中间阶段调用stop函数时,waitone会卡住所有函数。

看起来WaitOne卡住了回调,但我不明白为什么会发生这种情况,是不是在它自己的线程中找不到定时器回调?为什么stop函数的线程应该卡住它?

如果有人能向我解释情况并给我一个解决方案,我会很高兴的。

Dispose WaitOne函数卡住了计时器回调

您正在死锁您的计时器回调。来自MSDN:"在所有当前排队的回调完成之前,不会释放计时器。"

换句话说,在回调完成之前,System.Threading.Timer类不会自行处理。但是在Stop()方法返回之前,回调将拒绝完成。Stop()方法拒绝返回,直到处理完成。

如果您真的必须等待处理完成的通知,那么您有两个选项:将对Stop()的调用延迟到回调完成之后;或者将等待延迟到回调完成之后。不能做的是尝试在阻止您正在等待的事件的同一方法内等待。

IMHO最好的解决方案是不要等待Dispose()完成。这样做有什么意义?你真的需要等待吗?如果是,为什么?