2013-09-22 26 views
13

我想知道,当我运行Parallel.For/ForEach循环时将使用多少个线程。Parallel.For(Foreach)将创建多少个线程?默认MaxDegreeOfParallelism?

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

MaxDegreeOfParallelism帮助说(link):

默认情况下,和foreach将利用然而,许多线程 底层调度程序提供,所以从 改变MaxDegreeOfParallelism默认的唯一限制多少并发任务会使用。

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

我如何知道?

我可以用9999999运行循环测试它,但是这个测试会显示我的号码,但不是确定这个号码的规则。后来

编辑/添加:

我用Google搜索 “sheduler最大并发”,我发现(在MSDN - link),即TashSheduler类有MaximumConcurrencyLevel属性,:

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

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

+0

有趣的是,它返回常量'2147483647' ..而不是'int32.MaxValue'。 –

回答

13

根据MSDN

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

综观ThreadPooldocumentation,它说:

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