等待两个线程完成

如果你有一个主线程启动另外两个线程。 什么是使主线程等待其他两个线程最干净的方法?

我可以使用bgndworker和sleep spinner来检查bgnd worker的IsBusy,但我认为有更好的方法。

编辑更多要求:

  • 主线程还有其他一些工作要做(例如GUI)。
  • 两个衍生线程应该能够报告exception并返回结果值

请参阅此主题的答案。 我喜欢这个选项 ;-p

Forker p = new Forker(); p.Fork(delegate { DoSomeWork(); }); p.Fork(delegate { DoSomeOtherWork(); }); p.Join(); 

重新返回值/报告exception – 只需让每个fork在逻辑结束时将其作为回调…(您可以使用捕获的变量将状态传递到两个分支,包括共享记录器等)。

使用Thread.Join()的快速示例;

  Thread t1 = new Thread(new ThreadStart(delegate() { System.Threading.Thread.Sleep(2000); })); Thread t2 = new Thread(new ThreadStart(delegate() { System.Threading.Thread.Sleep(4000); })); t1.Start(); t2.Start(); t1.Join(); t2.Join(); 

使用等待句柄编辑另一个3示例:

  ManualResetEvent[] waitHandles = new ManualResetEvent[]{ new ManualResetEvent(false), new ManualResetEvent(false) }; Thread t1 = new Thread(new ParameterizedThreadStart(delegate(object state) { ManualResetEvent handle = (ManualResetEvent)state; System.Threading.Thread.Sleep(2000); handle.Set(); })); Thread t2 = new Thread(new ParameterizedThreadStart(delegate(object state) { ManualResetEvent handle = (ManualResetEvent)state; System.Threading.Thread.Sleep(4000); handle.Set(); })); t1.Start(waitHandles[0]); t2.Start(waitHandles[1]); WaitHandle.WaitAll(waitHandles); Console.WriteLine("Finished"); 
 thread1.Join(); thread2.Join(); 

除了其他答案之外……“启动两个线程并等待两个完成”的另一种选择是“启动一个线程并自己完成一个工作,然后等待另一个线程完成”。

当然,如果你想开始两个工作,在主线程上再做一些工作, 然后等待其他两个线程完成,这样做不太好。

编辑:如果主线程是一个UI线程,你不应该阻塞其他线程完成 – 你应该(IMO)让他们在完成后回调主线程。 这样,您在执行时仍会拥有响应式用户界面。

您不能等待完成并且可以使用GUI。 最好的方法是生成线程并使用事件与GUI进行通信。 请记住,在事件处理程序中,您无法修改控件。 而是直接使用Invoke方法。

WaitHandle.WaitAny是你的朋友。 它允许您等待多个线程或其他类型的对象发出信号。

http://msdn.microsoft.com/en-us/library/tdykks7z.aspx

编辑:

实际上,WaitHandle.WaitAll就是你想要的,而不是WaitAny。

http://msdn.microsoft.com/en-us/library/system.threading.waithandle.waitall.aspx

编辑:

一些提到的Join方法没问题,但一个缺点是它不是一个完全primefaces操作。 不过,这对您来说可能重要,也可能不重要。