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
});
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top