17

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

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

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

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

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

我怎样才能知道呢?

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

稍后编辑/添加:

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

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

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

4

1 回答 1

13

根据MSDN

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

查看 的文档ThreadPool它说:

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

于 2013-09-22T12:36:45.733 回答