Сколько порядка нужно навязать темам? Если вам нужно, чтобы вся работа, начатая в цикле, завершилась до продолжения кода, но вас не волнует порядок завершения работы в цикле, тогда вызов Join является ответом. Чтобы добавить более подробную информацию к ответу Кевина Кенни, , вам следует вызвать 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 внутри цикла, результат был бы в основном таким же, как если бы вы вообще не использовали потоки. Каждая итерация тела цикла создаст и запустит поток, но затем немедленно присоединится к нему и будет ждать его завершения.
Если отдельные потоки дают какой-либо результат (например, написать сообщение в журнале), тогда сообщения могут все еще появляться не в порядке, потому что между потоками нет никакой координации. Можно заставить потоки выводить свои результаты по порядку, согласовав их с монитором.