2016-04-29 69 views
0

我有一個多線程的應用程序,我希望能夠用一個定時器定期檢查,看看啓動一個新之前,即如果所有線程都完成:定期檢查,看看是否所有線程都完成

var checkStatusTimer = new System.Threading.Timer(new TimerCallback(CheckThreads), null, 10000, 10000); 

這就像我來了。 CheckThreads方法需要去檢查它們是否完成?我正在考慮一些功能的線條,檢查他們是否喜歡:

   foreach (Thread thread in Threads) 
      { 
       Thread t = thread; 
       if (t.ThreadState != ThreadState.Stopped) 
        return false; 
      } 

我在正確的軌道上嗎?這是正確的方式去做這件事?或者我應該使用System.Timers.Timer嗎?此外,我想要做這個定期檢查的函數形式是靜態的。任何幫助,將不勝感激。

+0

我建議你添加標籤[標籤:C#]或任何這是。 – nwp

回答

1

使用Task而不是Thread。然後,您可以創建一個組合任務:

Task[] tasks = ...; //You provide this 
Task combined = Task.WhenAll(tasks); 

現在您可以檢查完成:combined.IsCompleted。你也可以Waitawait那個任務。

Thread是一個傳統的API,這是一個很少使用的好主意。

+0

應用程序在.NET 3.5中運行,我認爲它不支持任務。 – user609926

+0

@ user609926使用此nuget包將任務介紹到.net 3.5:https://www.nuget.org/packages/TaskParallelLibrary/ – Maarten

0

@ usr的基於任務的方法是最好的,但是如果您必須依賴線程,那麼我建議在每個線程完成時調用一個方法從您的Threads集合中刪除線程。然後,您在定時器回調中必須執行的操作是檢查集合的數量。依賴於ThreadState is not advisable

相關問題