2008-08-09 4 views
8

У меня есть некоторый код для запуска нитки на .NET CF 2.0:Как дождаться завершения потока перед продолжением?

ThreadStart tStart = new ThreadStart(MyMethod); 
Thread t = new Thread(tStart); 
t.Start(); 

Если я называю это внутри цикла элементы полного выхода из строя. Как ввести ожидание после t.Start(), чтобы работа над потоком завершилась до того, как код продолжится? Будет ли BeginInvoke/EndInvoke лучше для этого, чем вручную создавать потоки?

ответ

9

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

В противоположность этому, если вы назвали Присоединяйтесь внутри цикла, то результат будет в основном такой же, как не с использованием потоков на всех. Каждая итерация тела цикла создавала бы и начинала бы поток, а затем сразу же присоединялась бы к нему и дождалась его завершения.

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

2

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

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

Если ты должен ждать нить для завершения вы можете просто сделать:

t.Join(); 
4

Другой способ ожидания завершения резьбы - использовать 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(); 
}