System.Threading.Timer 回调永远不会被调用
本文关键字:调用 永远 Threading Timer 回调 System | 更新日期: 2023-09-27 18:32:25
My System.Threading.Timer (具有回调)永远不会可靠地触发。这是我编程作业的一部分,我输入计时器应该从文本框运行的时间量。
计时器的声明如下:
System.Threading.Timer timer = new System.Threading.Timer(WorkerObject.callback, null, delay, Timeout.Infinite);
延迟只是描述回调第一次触发延迟的int
(它只应该触发一次)。
回调方法如下所示:
public static void callback(Object stateinfo)
{
stop = true;
}
所做的只是将一个标志设置为 true,以停止循环(该循环由 ThreadPool 上的线程运行,实际上停止线程)。
循环如下所示:
while (!stop)
{
currentTextbox.Invoke(new Action(delegate()
{
currentTextbox.AppendText((counter++) + Environment.NewLine);
currentTextbox.Update();
}));
}
我的问题是,对于超过 5000 毫秒的任何延迟,stop
变量始终为 false。有没有办法"强制"回调始终触发?
您需要保留对计时器的引用。
计时器对象很可能正在被垃圾回收,这将运行其终结器,停止计时器。
因此,只要您需要计时器处于活动状态,请保留引用。
我建议使用CancellationTokenSource
:
static CancellationTokenSource Cancel = new CancellationTokenSource();
public static void Callback(object state)
{
Cancel.Cancel();
}
和您的循环:
while (!Cancel.IsCancellationRequested)
{
...
}
这比使用 volatile
要干净得多,并且当您将简单概念证明移动到单独的类时更容易移植。有关更多信息,请参阅我的博客"取消投票"。
运行时抖动可能正在优化您的while(!stop)
条件以while(true)
。将stop
变量标记为易失性。
private volatile bool stop = false;