2016-12-25 56 views
-1

有没有一种方法可以重用用于循环调用呼叫中的线程?我很想做,因为我明白线程创建可能会很昂贵。Parallel.For/Foreach线程重用C#

,这是我希望做什么:

var collection = CreateMyCollection() 
var pool = CreateThreadPool() 
for(int i =0 ; i<1000 ; i++) 
     Parallel.ForEach(pool, collection, (element) => Calculate(element, i)) 

这可能吗?

注:我不能parallize而不是外部环路

+3

我想说'Parallel'方法使用的线程只是来自任务池,所以使用任务本质上应该是重用这些相同的线程。 – Abion47

+0

哇,我会查找文档,你有链接? –

回答

2

Parallel.ForEach(“我的”之间的硬扶养)是TPL一部分。默认TaskSceduler负责将工作项排入线程,将使用ThreadPool。

TaskScheduler类的实例表示任务调度程序。任务调度程序确保最终执行任务的工作。 默认任务调度程序基于.NET Framework 4线程 池,该池为负载平衡提供工作窃取,线程 注入/退出以获得最大吞吐量,并且总体良好的性能为 。在大多数情况下,这应该足够了。 TaskScheduler类也用作所有可定制调度逻辑的扩展点。这包括如下机制,例如如何将 安排为执行任务,以及如何将调度任务暴露给调试器。如果您需要特殊功能,您可以 创建自定义调度程序并为特定任务或查询启用它。

+0

非常感谢 –