Parallel.For(Foreach)将创建多少个线程? 默认MaxDegreeOfParallelism?
我想知道,当我运行Parallel.For / ForEach循环时将使用多少个线程。
我发现,它可以通过MaxDegreeOfParallelism选项进行更改。
MSDN上的MaxDegreeOfParallelism帮助说( 链接 ):
默认情况下,For和ForEach将使用底层调度程序提供的许multithreading,因此从默认值更改MaxDegreeOfParallelism仅限制将使用多少并发任务。
但我不知道调度程序提供了多少线程。
我该怎么知道呢?
我可以用9999999运行的循环测试它,但是这个测试会显示我的数字,但不会显示确定该数字的规则。
稍后编辑/添加:
我搜索了“sheduler max concurrency”,我发现(在MSDN – 链接 ), TashSheduler
类具有MaximumConcurrencyLevel
属性,并且:
返回表示最大并发级别的整数。 默认调度程序返回Int32.MaxValue。
TaskSheduler类是否用作这些并行循环的“底层调度程序”?
根据MSDN :
任务并行库和PLINQ的默认调度程序使用.NET Framework
ThreadPool
来排队和执行工作。 在.NET Framework 4中,ThreadPool
使用System.Threading.Tasks.Task
类型提供的信息来有效地支持并行任务和查询经常表示的细粒度并行性(短期工作单元)。
看一下ThreadPool
的文档 ,它说:
每个进程有一个线程池。 从.NET Framework 4开始,进程的线程池的默认大小取决于多个因素,例如虚拟地址空间的大小。 进程可以调用
GetMaxThreads
方法来确定线程数。 可以使用SetMaxThreads
方法更改线程池中的线程数。