簡體   English   中英

永遠不會調用System.Threading.Timer回調

[英]System.Threading.Timer callback is never called

我的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變量標記為volatile。

private volatile bool stop = false;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM