【问题标题】:multithreading while blocking main thread阻塞主线程时的多线程
【发布时间】:2009-09-15 23:02:11
【问题描述】:

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

【问题讨论】:

  • 上述问题在 C# 中的线程

标签: c# multithreading


【解决方案1】:

从主线程,在其他每个线程上调用Thread.Join

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

例如:

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

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

如果您只想等到他们全部完成,您调用Join 的顺序并不重要。 (如果您想在 任何 个完成后继续,您需要进入等待句柄领域。)

【讨论】:

  • 在 .NET 4.0 中,您还可以通过使用 System.Threading.CountdownEvent 并在子线程上调用“信号”和在主线程上调用“等待”或 System.Threading.Barrier 来获得价值并在所有三个线程上调用 SignalAndWait。
【解决方案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 中,第一个参数是在您的方法中传递的值。

【讨论】:

    【解决方案3】:

    在 MSDN 上有一个关于如何在 C# 中进行线程处理的好例子

    http://msdn.microsoft.com/en-us/library/aa645740(VS.71).aspx#vcwlkthreadingtutorialexample1creating

    如果您查看 Mutex 示例,它演示了将主线程置于睡眠状态,直到所有子线程都完成。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-25
        • 2018-02-16
        • 1970-01-01
        • 2016-09-25
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多