如果你有一个主线程启动另外两个线程。 什么是让主线程等待其他两个线程最干净的方法?
我可以使用bgndworker和sleep spinner来检查bgnd worker的IsBusy,但我认为有更好的方法。
修改 更多要求:
答案 0 :(得分:10)
使用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");
答案 1 :(得分:5)
查看this thread上的答案。我喜欢this option ;-p
Forker p = new Forker();
p.Fork(delegate { DoSomeWork(); });
p.Fork(delegate { DoSomeOtherWork(); });
p.Join();
重新返回值/报告异常 - 只需让每个分支在逻辑结束时作为回调...(您可以使用捕获的变量将状态传递到两个分支中,包括共享记录器等)。 / p>
答案 2 :(得分:3)
thread1.Join();
thread2.Join();
答案 3 :(得分:1)
除了其他答案之外......“启动两个线程并等待两个完成”的另一种选择是“启动一个线程并自己完成一个工作,然后等待另一个线程完成“。
当然,如果你想要开始两个工作,在主线程上再做一些工作,那么然后等待其他两个线程完成,这样做效果不好。
编辑:如果主线程是一个UI线程,你不应该阻塞其他线程完成 - 你应该(IMO)让它们在完成后回调主线程。这样,您在执行时仍会拥有响应式用户界面。答案 4 :(得分:1)
您不能等待完成并且可以使用GUI。最好的方法是生成线程并使用事件与GUI进行通信。请记住,在事件处理程序中,您无法修改控件。而是直接使用Invoke方法。
答案 5 :(得分:0)
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方法没问题,但一个缺点是它不是一个完全原子操作。但这对你来说可能是重要的,也可能不重要。