我有一个主线程,它产生大约20个工作线程 我需要停止主线程,直到所有其他线程都完成 我知道(线程).Join。但这只适用于一个线程。
并且多个联接伤害了这样的表现。
t1.Join()
t2.Join()
...
t20.Join()
因为程序一个接一个地等待每个人停下来。
我怎么做到这一点 主线程等待所有一组线程结束?
答案 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);
或者,如果您使用某种循环来生成线程:
答案 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中执行此操作。