C# 阻塞主线程时的多线程处理

C# 阻塞主线程时的多线程处理,c#,multithreading,C#,Multithreading,如何一次启动2个或多个线程并阻止主线程,直到其他线程完成?从主线程调用其他每个线程 (编辑:现在您已经指定了C#,不需要平台无关的注释。) 例如: Thread t1 = new Thread(FirstMethod).Start(); Thread t2 = new Thread(SecondMethod).Start(); t1.Join(); t2.Join(); 如果你只想等到它们全部完成,那么你称之为加入的顺序并不重要。(如果您想在其中任何一个完成后继续,您需要进入等待句柄的领域。

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

从主线程调用其他每个线程

(编辑:现在您已经指定了C#,不需要平台无关的注释。)

例如:

Thread t1 = new Thread(FirstMethod).Start();
Thread t2 = new Thread(SecondMethod).Start();

t1.Join();
t2.Join();

如果你只想等到它们全部完成,那么你称之为加入的顺序并不重要。(如果您想在其中任何一个完成后继续,您需要进入等待句柄的领域。)

有一个很好的示例,说明如何在MSDN上的C#中执行线程

如果查看互斥体示例,它将演示如何将主线程置于睡眠状态,直到所有子线程都完成

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中,第一个参数是在方法内部传递的值。

Wintellect的Jeffry Richter有一个名为Power Threading library的函数。我自己没有使用过它,但它可能会有所帮助。

在C中使用线程#对于.NET 4.0中的上述问题,您还可以使用System.Threading.CountdownEvent并在子线程上调用'Signal',在主线程上调用'Wait',或者在所有三个线程上使用System.Threading.Barrier和call SignalAndWait来获得价值。