我有一个主线程,它会产生大约20个工作线程。
我需要停止主线程直到所有其他线程都完成。
我知道(thread).Join。但那只适用于一个线程。
而且多个Joins会影响性能,如下所示。
t1.Join()
t2.Join()
...
t20.Join()
因为程序会一个接一个地等待每个线程停止。
我该如何使主线程等待一组线程全部结束呢?
我有一个主线程,它会产生大约20个工作线程。
我需要停止主线程直到所有其他线程都完成。
我知道(thread).Join。但那只适用于一个线程。
而且多个Joins会影响性能,如下所示。
t1.Join()
t2.Join()
...
t20.Join()
因为程序会一个接一个地等待每个线程停止。
我该如何使主线程等待一组线程全部结束呢?
你应该真正了解一下任务并行(任务并行库)。它使用线程池,但还可以管理任务的窃取等。
引用:“TPL动态地扩展并发度,以最有效地使用所有可用的处理器。此外,TPL处理工作的分区、线程池上的线程调度、取消支持、状态管理和其他低级细节。”来自任务并行库
你可以这样使用它:
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);
如果您使用某种循环来生成线程:
如果你想这样做,join
是可行的。但主线程仍然必须等待所有工作线程终止。请查看此网站,它是C# in a Nutshell
中的一章样例。恰好是线程章节:http://www.albahari.com/threading/part4.aspx。
我没有看到等待线程一个一个完成会产生明显的性能损失。因此,一个简单的foreach
循环就可以实现您想要的功能,而不需要任何不必要的花哨东西:
foreach (Thread t in threads) t.Join();
注意:当然,有一个Win32 API函数可以同时等待几个对象(在这种情况下是线程)——WaitForMultipleObjectsEx
。互联网上有许多帮助类或线程框架利用它来实现你想要的功能。但是,对于简单的情况,你真的需要它们吗?
多个连接会影响性能,就像这样。
如果你想等待所有线程退出,调用.join()方法即可,不会有“性能损失”。
将线程放入列表中并执行:
foreach(var t in myThread)
t.join();