2

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

计时器:

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();
    }

}

在 stop 函数后面的timerDisposeHandler.WaitOne();代码之前使用确保 dispose 完成。

但有时当在回调的中间调用停止函数时,waitone 卡住了。

似乎 WaitOne 卡住了回调,但我不明白为什么会这样,是不是在它自己的线程中找不到计时器回调?为什么stop函数的线程要卡住呢?

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

4

1 回答 1

2

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

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

如果您确实必须等待处理完成的通知,您有两个选择:延迟对 Stop() 的调用,直到回调完成;或延迟等待,直到回调完成后。您不能做的是尝试在阻止您正在等待的事件的同一方法中等待。

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

于 2014-10-20T08:15:12.230 回答