gpt4 book ai didi

c# - 处理 WaitOne 函数卡住的定时器回调

转载 作者:行者123 更新时间:2023-12-03 13:00:13 31 4
gpt4 key购买 nike

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

计时器:

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 全部卡住。

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

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

最佳答案

您正在使计时器回调陷入僵局。来自 MSDN : "直到所有当前排队的回调都完成后,计时器才会被释放。"

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

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

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

关于c# - 处理 WaitOne 函数卡住的定时器回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26459752/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com