Сколько заказа вам нужно наложить на резьбе? Если вам просто нужно, чтобы вся работа, начатая в цикле, завершилась до того, как код будет продолжен, но вам все равно, что порядок работы в цикле завершен, тогда вызов Join - это ответ. Чтобы добавить более подробную информацию к Kevin Kenny's answer,, вы должны позвонить в компанию за пределами цикл. Это означает, что вам потребуется набор для хранения ссылок на резьбе вы начали:
// 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();
}
В противоположность этому, если вы назвали Присоединяйтесь внутри цикла, то результат будет в основном такой же, как не с использованием потоков на всех. Каждая итерация тела цикла создавала бы и начинала бы поток, а затем сразу же присоединялась бы к нему и дождалась его завершения.
Если отдельные потоки выдают некоторый результат (например, записывают сообщение в журнал), сообщения могут по-прежнему появляться не в порядке, поскольку между потоками нет координации. Можно получить потоки для вывода своих результатов в порядке их координации с помощью монитора.