Parallel.For(Foreach)将创建多少个线程?默认MaxDegreeOfParallelism?

Kam*_*mil 14 c# multithreading parallel.foreach .net-4.5

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

我发现,它可以通过MaxDegreeOfParallelism选项进行更改.

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

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

但我不知道调度程序提供了多少个线程.

我该怎么知道呢?

我可以用9999999运行循环测试它,但是这个测试会显示数字,但不是确定该数字的规则.

稍后编辑/添加:

我搜索了"sheduler max并发",我发现(在MSDN - 链接),TashSheduler该类有MaximumConcurrencyLevel属性,并且:

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

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

T.C*_*.C. 13

根据MSDN:

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

综观文档ThreadPool,它说:

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