给出以下代码:
var arrayStrings = new string[1000]; Parallel.ForEach<string>(arrayStrings, someString => { DoSomething(someString); });
所有1000个线程会几乎同时生成吗?
不,它不会启动1000个线程-是的,它将限制使用的线程数。并行扩展会根据您实际拥有的核心数量 和 已经繁忙的核心数量使用适当数量的核心。它为每个内核分配工作,然后使用一种称为 工作窃取 的技术来使每个线程有效地处理自己的队列,并且在真正需要时仅需要执行任何昂贵的跨线程访问。
看一看在PFX团队博客的 负载 有关如何分配工作的信息和各种其他主题。
请注意,在某些情况下,您也可以指定所需的并行度。