C# Dispose WaitOne函数被计时器回调卡住

C# Dispose WaitOne函数被计时器回调卡住,c#,multithreading,timer,callback,manualresetevent,C#,Multithreading,Timer,Callback,Manualresetevent,我有一个计时器,它是用来做一些事情的: 计时器: dataProcessingTimer = new System.Threading.Timer(new TimerCallback(DataProcessingTimerHandler), null, 0, _dataProcessingTimerPollingInterval); 回调函数: void DataProcessingTimerHandler(object param) { // some code.. (sometim

我有一个计时器,它是用来做一些事情的:

计时器:

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似乎卡住了回调,但我不明白为什么会发生这种情况,是不是在它自己的线程中找不到计时器回调?为什么停止函数的线程会卡住它


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

您正在死锁计时器回调。From:“在所有当前排队的回调完成之前,不会释放计时器。”

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

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


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

我真的需要等待,因为停止后的代码需要使用我在回调中接收到的数据,所以我必须等待它结束。如果您的代码需要在回调中接收到的数据,那么您肯定不想从回调中调用stop(),因为这只是等待发生的另一层死锁。我认为让回调发出停止信号是有问题的,但是假设你真的需要它,那么你需要设置一些东西,以便回调仅仅发出一些代码,这些代码将在以后/其他地方执行,以实际执行停止,然后处理回调为你收集的所有数据。