配置WaitOne功能卡住定时器回调

时间:2014-10-20 06:38:23

标签: c# multithreading timer callback manualresetevent

我有一个计时器,它的回调可以做些事情:

计时器:

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();确保dispose完成了停止函数之后的代码。

但是有时当在回调的中间调用stop函数时,waitone会全部卡住。

似乎WaitOne卡住了回调,但我不明白它为什么会发生,是不是在自己的线程中找不到定时器回调?为什么停止功能的线程应该卡住它?

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

1 个答案:

答案 0 :(得分:1)

你正在使你的计时器回调陷入僵局。从MSDN:“在所有当前排队的回调完成之前,不会释放计时器。”

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

如果您真的必须等待被告知已完成处置,您有两种选择:将调用延迟到Stop(),直到回调完成为止;或延迟等待,直到回调完成。您无法做的是尝试在阻止您正在等待的事件的同一方法内等待。

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