Parallel.Foreach()vs. foreach(ienumerable .asparallel())
-
05-10-2019 - |
题
ERG,我试图使用反射器在BCL中找到这两种方法,但无法找到它们。这两个摘要有什么区别?
A:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
B:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
使用一个的后果有不同的后果吗? (假设我在两个示例的括号内做任何事情都是安全的。)
解决方案
他们做一些完全不同的事情。
第一个采用匿名委托,并对所有不同项目并行运行该代码的多个线程。
在这种情况下,第二个不是很有用。简而言之,它旨在在多个线程上进行查询,并将结果结合在一起,然后再次将其放在调用线程中。因此,foreach语句上的代码始终保留在UI线程上。
只有在您在LINQ查询右侧进行昂贵的事情时才有意义 AsParallel()
打电话,喜欢:
var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));
其他提示
区别是,b不平行。唯一的事情 AsParallel()
确实是它围绕 IEnumerable
, ,因此,当您使用LINQ方法时,使用它们的并行变体。包装纸 GetEnumerator()
(在幕后使用 foreach
)甚至还返回原始收藏的结果 GetEnumerator()
.
顺便说一句,如果您想查看反射器中的方法, AsParallel()
在里面 System.Linq.ParallelEnumerable
上课 System.Core
部件。 Parallel.ForEach()
在里面 mscorlib
汇编(名称空间 System.Threading.Tasks
).
第二种方法不会平行于示例中使用Asparallel()的正确方法
IEnumerable<string> items = ...
items.AsParallel().ForAll(item =>
{
//Do parallel stuff here
});
不隶属于 StackOverflow