Как ожидать потока, завершенного перед продолжением?

11
задан Ijas Ameenudeen 20 January 2019 в 13:56
поделиться

3 ответа

Сколько порядка необходимо наложить на потоки? Если Вам просто нужна вся работа, запущенная в цикле для окончания, прежде чем код продолжится, но Вы не заботитесь о порядке о работе в концах цикла, то вызов Соединения является ответом. Для добавления большего количества детали к ответу 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();
}

Напротив, при вызове Соединения в цикле результат в основном совпал бы с потоками не использования вообще. Каждое повторение тела цикла создало бы и запустило бы поток, но затем сразу Соединение это и ожидало бы его для окончания.

Если отдельные потоки приводят к некоторому результату (запишите сообщение в журнале, например), затем сообщения могут все еще казаться неисправными, потому что нет никакой координации между потоками. Возможно заставить потоки производить свои результаты в порядке путем координирования их с Монитором.

11
ответ дан 3 December 2019 в 06:49
поделиться

Если я читаю это правильно, Вы запускаете объекты работы на наборе потоков, но Вы обеспокоены, что потоки завершаются не в порядке, и, предпочли бы ожидать, пока каждый поток не завершается в порядке, они были запущены?

Если это верно, затем я не уверен, почему Вы создаете поток на объект работы. Возможно, Вы могли расшириться?

Если бы действительно необходимо было ожидать потока для завершения, то Вы могли бы просто сделать:

t.Join();
3
ответ дан 3 December 2019 в 06:49
поделиться

Другой способ ожидать потока для окончания использует 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();
}
4
ответ дан 3 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: