【发布时间】:2009-09-15 23:02:11
【问题描述】:
如何一次启动 2 个或更多线程并阻塞主线程,直到其他线程完成?
【问题讨论】:
-
上述问题在 C# 中的线程
标签: c# multithreading
如何一次启动 2 个或更多线程并阻塞主线程,直到其他线程完成?
【问题讨论】:
标签: c# multithreading
从主线程,在其他每个线程上调用Thread.Join。
(编辑:现在您已经指定了 C#,不需要与平台无关的注释。)
例如:
Thread t1 = new Thread(FirstMethod).Start();
Thread t2 = new Thread(SecondMethod).Start();
t1.Join();
t2.Join();
如果您只想等到他们全部完成,您调用Join 的顺序并不重要。 (如果您想在 任何 个完成后继续,您需要进入等待句柄领域。)
【讨论】:
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 中,第一个参数是在您的方法中传递的值。
【讨论】:
在 MSDN 上有一个关于如何在 C# 中进行线程处理的好例子
http://msdn.microsoft.com/en-us/library/aa645740(VS.71).aspx#vcwlkthreadingtutorialexample1creating
如果您查看 Mutex 示例,它演示了将主线程置于睡眠状态,直到所有子线程都完成。
【讨论】:
Wintellect 的 Jeffry Richter 有一个称为 Power Threading 库的 library for download。我自己没有使用过,但它可能会有所帮助。
【讨论】: