2016-04-29 5 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

Threadの代わりにTaskを使用してください。

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

これで、完了を確認することができます:combined.IsCompletedWaitawaitそのタスクもできます。

Threadは、使用することはめったにないレガシーAPIです。

+0

アプリケーションは、タスクをサポートしていないと思われる.NET 3.5で動作しています。 – user609926

+0

@ user609926このナゲットパッケージを使用して、タスクを.net 3.5に導入する:https://www.nuget.org/packages/TaskParallelLibrary/ – Maarten

0

@ usrのタスクベースのアプローチが最適ですが、スレッドに依存する必要がある場合、各スレッドが完了すると、Threadsコレクションからスレッドを削除するメソッドが呼び出されます。タイマーのコールバックで行う必要があるのは、コレクションの数をチェックすることだけです。 ThreadStateに頼ってis not advisable