Сколько порядка необходимо наложить на потоки? Если Вам просто нужна вся работа, запущенная в цикле для окончания, прежде чем код продолжится, но Вы не заботитесь о порядке о работе в концах цикла, то вызов Соединения является ответом. Для добавления большего количества детали к ответу Kevin Kenny необходимо назвать Соединение вне цикла. Это означает необходимость в наборе для содержания ссылок на потоки, которые Вы запустили:
// 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();
}
Напротив, при вызове Соединения в цикле результат в основном совпал бы с потоками не использования вообще. Каждое повторение тела цикла создало бы и запустило бы поток, но затем сразу Соединение это и ожидало бы его для окончания.
Если отдельные потоки приводят к некоторому результату (запишите сообщение в журнале, например), затем сообщения могут все еще казаться неисправными, потому что нет никакой координации между потоками. Возможно заставить потоки производить свои результаты в порядке путем координирования их с Монитором.
Если я читаю это правильно, Вы запускаете объекты работы на наборе потоков, но Вы обеспокоены, что потоки завершаются не в порядке, и, предпочли бы ожидать, пока каждый поток не завершается в порядке, они были запущены?
Если это верно, затем я не уверен, почему Вы создаете поток на объект работы. Возможно, Вы могли расшириться?
Если бы действительно необходимо было ожидать потока для завершения, то Вы могли бы просто сделать:
t.Join();
Другой способ ожидать потока для окончания использует AutoResetEvent
.
private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false);
private void Blah()
{
ThreadStart tStart = new ThreadStart(MyMethod);
Thread t = new Thread(tStart);
t.Start();
//... (any other things)
mWaitForThread.WaitOne();
}
private void MyMethod()
{
//... (execute any other action)
mWaitForThread.Set();
}