我如何让我的方法等待所有线程完成?
我有一个方法是触发线程来做一些工作。 将有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();