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