如何一次启动2个或多个线程并阻塞主线程直到其他线程完成?
答案 0 :(得分:12)
从主线程中,在每个其他线程上调用Thread.Join
。
(编辑:现在你已经指定了C#,不需要平台无关的评论。)
例如:
Thread t1 = new Thread(FirstMethod).Start();
Thread t2 = new Thread(SecondMethod).Start();
t1.Join();
t2.Join();
如果您只想等到所有完成,那么您调用Join
的顺序无关紧要。 (如果你想在任何完成时继续,你需要进入等待句柄领域。)
答案 1 :(得分:2)
public delegate void AsyncTask(object state);
public void Method1(object state) .....
public void Method2(object state) .....
public void RunAsyncAndWait(){
AsyncTask ac1 = new AsyncTask(Method1);
AsyncTask ac2 = new AsyncTask(Method2);
WaitHandle[] waits = new WaitHandle[2];
IAsyncResult r1 = ac1.BeginInvoke( someData , null , null );
IAsyncResult r2 = ac2.BeginInvoke( someData , null , null );
waits[0] = r1.AsyncWaitHandle;
waits[1] = r2.AsyncWaitHandle;
WaitHandle.WaitAll(waits);
}
这样可行,有些人会认为如果任何线程首先完成它会无休止地等待,但我已经尝试过,它总是有效。你也可以给予超时等待。在BeginInvoke中,第一个参数是在方法中传递的值。
答案 2 :(得分:0)
有一个很好的例子,说明如何在MSDN上使用C#进行线程化
http://msdn.microsoft.com/en-us/library/aa645740(VS.71).aspx#vcwlkthreadingtutorialexample1creating
如果你看一下Mutex的例子,它会演示让主线程处于休眠状态,直到所有子线程都完成为止。
答案 3 :(得分:0)