我如何让我的方法等待所有线程完成?

我有一个方法是触发线程来做一些工作。 将有2个线程在一段时间内异步运行,并且当调用它们的回调方法时,回调将触发另一个线程,直到完成所有工作。 如何让我的方法等待所有这些线程完成并被解雇?

Interlocked.Increment在启动任何线程之前初始化为零的计数器。 Interlocked。在退出/环回之前减少每个线程中的计数器。 如果任何线程将计数器递减为零,则设置()一个AutoResetEvent。 AutoResetEvent上的WaitOne()。

Rgds,马丁

简单的调用Join所有线程。 所以,如果你有两个线程变量:

 thread1.Join(); thread2.Join(); 

或者,如果你有一个集合:

 foreach (Thread thread in threads) { thread.Join(); } 

线程完成的顺序无关紧要; 所有线程完成后代码才会继续。

但是,如果你一直在创建新的线程,那么这可能没什么用…你可能需要一些只能在一个锁中访问的集合(例如一个队列),并获得每个线程产生的活动将新线程添加到队列中…然后迭代(小心!)直到队列为空:

 while (true) { Thread nextThread; lock (collectionLock) { if (queue.Count == 0) { break; } nextThread = queue.Dequeue(); } nextThread.Join(); } 

理想情况下,如果您使用的是.NET 4,请尝试使用任务并行库 – 这会让很多东西变得更容易:)

使用WaitHandles,每个线程都应该有一个WaitHandle,比如ManualResetEvent,并在完成时调用事件上的Set()。

main方法应该使用WaitHandle.WaitAll传入每个线程的句柄。

  IList waitHandles = new List(); var newThread = new Thread(new ParameterizedThreadStart((handle) => { // thread stuff goes here ((ManualResetEvent)handle).Set(); })); var manualResetEvent = new ManualResetEvent(false); waitHandles.Add(manualResetEvent); newThread.Start(manualResetEvent); // create other threads similarly // wait for all threads to complete - specify a timeout to prevent a deadlock if a thread fails to set the event WaitHandle.WaitAll(waitHandles.ToArray()); 

在最简单的情况下,您可以使用Join

  Threading.Thread myThread1 = new Thread(new ThreadStart(Worker1)); Threading.Thread myThread2 = new Thread(new ThreadStart(Worker2)); myThread1.Start(); myThread2.Start(); myThread1.Join(); myThread2.Join();