我如何等待多个线程停止?

时间:2010-09-05 14:32:10

标签: c# multithreading c#-4.0

我有一个主线程,它产生大约20个工作线程 我需要停止主线程,直到所有其他线程都完成 我知道(线程).Join。但这只适用于一个线程。

并且多个联接伤害了这样的表现。

t1.Join()
t2.Join()
...
t20.Join()

因为程序一个接一个地等待每个人停下来。

我怎么做到这一点 主线程等待所有一组线程结束?

5 个答案:

答案 0 :(得分:11)

你应该真正研究Task Parallelism (Task Parallel Library)。它使用线程池,但也管理任务窃取等。

引用:“ TPL动态地扩展并发度,以最有效地使用所有可用的处理器。此外,TPL处理工作的分区,ThreadPool上的线程调度,取消支持,状态管理和其他低级细节。“on Task Parallel Library

你可以像这样使用它:

Task[] tasks = new Task[3]
{
    Task.Factory.StartNew(() => MethodA()),
    Task.Factory.StartNew(() => MethodB()),
    Task.Factory.StartNew(() => MethodC())
};

//Block until all tasks complete.
Task.WaitAll(tasks);

或者,如果您使用某种循环来生成线程:

Data Parallelism (Task Parallel Library)

答案 1 :(得分:4)

如果这就是你想要的那样,那么join就没问题了。主线程仍然必须等待所有工作线程终止。查看此网站,这是C# in a Nutshell的示例章节。恰好是线程章节:http://www.albahari.com/threading/part4.aspx

答案 2 :(得分:2)

在等待线程逐个完成时,我看不出明显的性能损失。所以,一个简单的foreach可以做你想要的,没有任何不必要的花边和口哨声:

foreach (Thread t in threads) t.Join();

注意:当然,有一个Win32 API函数允许同时等待多个对象(在本例中为线程) - WaitForMultipleObjectsEx。 Internet上有许多帮助程序类或线程框架,可以根据需要使用它。但是你真的需要它们用于一个简单的案例吗?

答案 3 :(得分:2)

  

并且多个联接会影响性能   像这样。

没有“性能受损”,如果你想等待所有线程退出,你可以在线程上调用.join()。

将您的主题填入列表并执行

foreach(var t in myThread)
     t.join();

答案 4 :(得分:1)

如果您确定您将永远拥有<然后你可以让每个新线程在它退出之前可靠地设置一个事件,并且一旦启动所有线程,就可以对主线程中的事件进行WaitAll。 Event对象将在主线程中创建,并在线程创建时以线程安全的方式传递给相关的子线程。

在本机代码中,您可以在线程处理自己做同样的事情,但不知道如何在.Net中执行此操作。

另见先前的问题:C#: Waiting for all threads to complete