阻塞主线程时多线程

时间:2009-09-15 14:30:18

标签: c# multithreading

如何一次启动2个或多个线程并阻塞主线程直到其他线程完成?

4 个答案:

答案 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)

Wintellect的Jeffry Richter有一个名为Power Threading库的library for download。我自己没有用它,但它可能会有所帮助。