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。有没有办法"强制"回调始终触发?

System.Threading.Timer 回调永远不会被调用

您需要保留对计时器的引用。

计时器

对象很可能正在被垃圾回收,这将运行其终结器,停止计时器。

因此,只要

您需要计时器处于活动状态,请保留引用。

我建议使用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;