[英]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.