我有以下代碼塊正在由定時器啓動:正確的使用方法Task.Run和等待
private void CheckForScheduleItemsTimerOnElapsed(Object sender, ElapsedEventArgs elapsedEventArgs)
{
if (CurrentlyProcessingMsgs)
return;
CurrentlyProcessingMsgs = true;
var task = Task.Run(() => {
CheckForScheduleItems.Process(_cancellationToken);
}, _cancellationToken);
task.Wait(_cancellationToken);
CurrentlyProcessingMsgs = false;
}
現在我遇到的問題是,在某些情況下,該行
CurrentlyProcessingMsgs = false;
沒有被調用。這是我的理解,Task.Wait應該等待任務完成,然後繼續,從而重置該標誌。但在某些情況下,這並未發生。 (注意:這個定時器是由一個服務管理的。)發生什麼事情是在關機時,我正在檢查CurrentlyProcessingMsgs的值,有時在任務完成後它仍然是真的。
這樣做的目標是讓多個計時器像上面顯示的一樣被觸發。每個計時器都會執行類似於上面顯示的處理,並且我想在單獨的線程中運行每個進程。我誤解了我對CancellationToken的理解,因此在這種情況下,設置定時器和任務以通過這些方法運行並使每個線程都在單獨線程上的正確方法是什麼?
對於你的定時器的問題,它取決於你正在使用的計時器。一些內置於.NET的計時器會自動使用線程池來啓動計時器(Task.Run也在做同樣的事情)。您需要向我們展示您正在使用的計時器類。你可能已經在做你想做的事。 –
我正在使用System.Timers.Timer類來啓動計時器。 –
是否在其上設置了['Timer.SynchronizingObject'](https://msdn.microsoft.com/en-us/library/system.timers.timer.synchronizingobject(v = vs.110).aspx)值?如果它是'null',你的計時器已經創建了新的線程來運行計時器滴答,你不需要做任何額外的事情。 –