2008-10-29 28 views
1

給定一個System.Timers.Timer,是否有一種方法可以從主線程中判斷運行已過去的事件代碼的工作線程是否仍在運行?判斷'elapsed'事件線程是否仍在運行?

換句話說,在停止計時器或定時器運行的主應用程序/服務線程之前,如何確保工作線程中運行的代碼當前未運行?

這是一個使用狀態線程計時器的開槽問題,還是隻是直接使用線程的時間?

回答

1

查一查ManualResetEvent的,因爲它是由做你問具體是什麼了。

您的線程創建一個新的重置事件,並將其添加到您的主線程可用於查看是否有線程仍在運行的可訪問隊列。

// main thread owns this 
private List<ManualResetEvent> _resetEvents; 
... 
// main thread does this to wait for executing threads to finish 
WaitHandle.WaitAll(_resetEvents.ToArray(), 2000, false) 
... 
// worker threads do this to signal the thread is done 
myResetEvent.Set(); 

我可以給你更多的示例代碼,如果你想要的,但我基本上只是從我不得不這樣做一年前,所以我讀了幾文章抄了一遍。


忘了提及,您不能將此功能添加到計時器觸發時將獲得的默認線程中。所以你應該讓你的定時器處理器非常精簡,除了準備和啓動一個新的工作線程之外別無它物。

... 
ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkerDelegate), 
    myCustomObjectThatContainsAResetEvent); 
+0

哇。這真的很簡單。謝謝! – claco 2008-10-30 02:53:15

0

對於開箱即用的解決方案,沒有辦法。主要原因是即使運行回調的代碼已經完成,運行TimerCallback函數的線程幾乎仍然存在。 TimerCallback由ThreadPool中的Thread執行。任務完成後,線程不會死亡,而是返回到下一個線程池任務的隊列中。

爲了得到這個工作,你將不得不使用線程安全信號的方式來檢測操作已經完成。

Timer Documentation

相關問題