スレッドにどのくらいの順序を課す必要がありますか? コードを続行する前に、ループ内で開始されたすべての作業を終了する必要があるだけで、ループ内の作業が終了する順序は気にしない場合は、Join を呼び出すことが答えです。Kevin Kenny の回答に詳細を追加するには、ループの外でJoin を呼び出す必要があります。これは、開始したスレッドへの参照を保持するコレクションが必要になることを意味します。
// Start all of the threads.
List<Thread> startedThreads = new List<Thread>();
foreach (...) {
Thread thread = new Thread(new ThreadStart(MyMethod));
thread.Start();
startedThreads.Add(thread);
}
// Wait for all of the threads to finish.
foreach (Thread thread in startedThreads) {
thread.Join();
}
対照的に、ループ内で Join を呼び出した場合、結果は基本的にスレッドをまったく使用しない場合と同じになります。ループ本体の各反復は、スレッドを作成して開始しますが、すぐに参加して終了するのを待ちます。
個々のスレッドがなんらかの結果を生成する場合 (たとえば、ログにメッセージを書き込む)、スレッド間の調整がないため、メッセージは依然として順不同で表示されることがあります。スレッドを Monitor と連携させることで、スレッドに順番に結果を出力させることができます。