Parallel.For(Foreach)会创建多少个线程?默认的最大并行度是多少?

17

我想知道当我运行Parallel.For/ForEach循环时会使用多少线程。

我发现可以通过MaxDegreeOfParallelism选项进行更改。

MSDN上的MaxDegreeOfParallelism帮助文档(链接)说:

默认情况下,对于For和ForEach,将利用底层调度程序提供的任何线程,因此从默认值更改MaxDegreeOfParallelism仅限制将使用多少并发任务。

但我不知道底层调度程序提供多少个线程。

我该如何找到它?

我可以使用9999999次循环测试它,但是这个测试只会显示数字,而无法确定规则。

编辑/后添加:

我搜索了“sheduler max concurrency”,在MSDN上找到了(链接),TaskSheduler类具有MaximumConcurrencyLevel属性,并且:

返回一个整数,表示最大并发级别。 默认调度程序返回Int32.MaxValue。

这个TaskSheduler类是否用作这些并行循环的“底层调度程序”?


1
有趣的是,它返回常量2147483647,而不是int32.MaxValue - Simon Whitehead
1个回答

13
根据MSDN的说法:

任务并行库(Task Parallel Library)和 PLINQ 的默认调度程序使用 .NET Framework ThreadPool 来排队和执行工作。在 .NET Framework 4 中,ThreadPool 使用由 System.Threading.Tasks.Task 类型提供的信息来有效地支持并行任务和查询通常表示的细粒度并行性(短寿命的工作单元)。

查看 ThreadPool文档,它说:

每个进程有一个线程池。从 .NET Framework 4 开始,进程的线程池的默认大小取决于多个因素,例如虚拟地址空间的大小。进程可以调用 GetMaxThreads 方法来确定线程数。可以使用 SetMaxThreads 方法更改线程池中的线程数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接