问题描述
我想知道,当我运行 Parallel.For/ForEach 循环时,会用到多少线程.
I want to know, how many threads will be used when I run Parallel.For/ForEach loop.
我发现,它可以通过 MaxDegreeOfParallelism 选项改变.
I found, that it can be changed by MaxDegreeOfParallelism option.
MSDN 上的 MaxDegreeOfParallelism 帮助说(链接):
MaxDegreeOfParallelism help on MSDN says (link):
默认情况下,For 和 ForEach 将使用任意多的线程底层调度程序提供,因此将 MaxDegreeOfParallelism 从默认仅限制将使用的并发任务数.
但我不知道调度程序底层提供了多少线程.
But I don't know how many threads underlying scheduler provides.
我怎样才能知道?
我可以用 9999999 次运行的循环来测试它,但是这个测试会显示数字,而不是确定该数字的规则.
I could test it with loop with 9999999 runs, however this test will show me number, but not the rule that determine that number.
稍后编辑/添加:
我在谷歌上搜索了sheduler max concurrency",我发现(在 MSDN - link),该 TashSheduler
类具有 MaximumConcurrencyLevel
属性,并且:
I googled for "sheduler max concurrency", and I found (at MSDN - link), that TashSheduler
class has MaximumConcurrencyLevel
property, and:
返回一个表示最大并发级别的整数.这默认调度程序返回 Int32.MaxValue.
那个 TaskSheduler 类被用作这些并行循环的底层调度程序"?
推荐答案
根据 MSDN:
任务并行库和 PLINQ 的默认调度程序使用 .NET Framework ThreadPool
来排队和执行工作.在 .NET Framework 4 中,ThreadPool
使用 System.Threading.Tasks.Task
类型提供的信息来有效地支持细粒度并行(短实时工作单元)通常代表并行任务和查询.
查看ThreadPool
的文档,它说:
每个进程有一个线程池.从 .NET Framework 4 开始,进程的线程池的默认大小取决于多个因素,例如虚拟地址空间的大小.进程可以调用GetMaxThreads
方法来确定线程数.可以使用SetMaxThreads
方法更改线程池中的线程数.
这篇关于Parallel.For(Foreach) 将创建多少个线程?默认 MaxDegreeOfParallelism?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!