首页 > 解决方案 > Differences between Parallel.ForEach and await ForEachAsync

问题描述

Is there any reason to choose Parallel.ForEach instead of await ForEachAsync in any situation (or vice-versa)? or they are virtually the same?

await collection.ForEachAsync( m => { m.DoSomething(); } );

VS

Parallel.ForEach( collection, m => { m.DoSomething(); } );

标签: c#parallel-processingparallel.foreach

解决方案


它们根本不是“几乎相同的”。

当您使用Parallel类中的函数时,例如Parallel.ForEach()您正在调用某个操作,其中该操作被分解为多个较小的操作,每个操作在不同的线程(也称为多线程)上执行。

ForEachAsync另一方面不一定是多线程的。它是异步的,并且异步操作不是多线程的(它们可以是,但不一定是,这取决于实现)。

我强烈建议阅读以下关于该主题的更详细信息的帖子。

至于你的问题

在任何情况下是否有任何理由选择 Parallel.ForEach 而不是 await ForEachAsync

答案肯定是有这样做的理由,但是为了确定您将使用哪种场景,您必须同时了解它们。

这是一个简单的例子:

你有一个对象的集合,你想遍历它们并执行某种操作。你关心这些动作发生的顺序吗?如果是这样,请不要使用Parallel.ForEach(),因为无法保证调用它们的顺序(由于其多线程性质)。

编辑:

在您的示例中,这完全取决于有多少项目collection以及流程繁重DoSomething()

这样做的原因是因为Parallel.ForEach()不是免费的。需要权衡取舍。设置多线程环境需要时间,如果时间collection很小和/或DoSomething()不需要长时间,那么设置这些线程所花费的时间会更好(通常更快)用于单线程异步操作。

另一方面,如果collection是大型和/或DoSomething()流程繁重的任务,那么Parallel.ForEach()绝对是性能最高的选项。


推荐阅读