c# - 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(); } );
解决方案
它们根本不是“几乎相同的”。
当您使用Parallel类中的函数时,例如Parallel.ForEach()
您正在调用某个操作,其中该操作被分解为多个较小的操作,每个操作在不同的线程(也称为多线程)上执行。
ForEachAsync
另一方面不一定是多线程的。它是异步的,并且异步操作不是多线程的(它们可以是,但不一定是,这取决于实现)。
我强烈建议阅读以下关于该主题的更详细信息的帖子。
至于你的问题
在任何情况下是否有任何理由选择 Parallel.ForEach 而不是 await ForEachAsync
答案肯定是有这样做的理由,但是为了确定您将使用哪种场景,您必须同时了解它们。
这是一个简单的例子:
你有一个对象的集合,你想遍历它们并执行某种操作。你关心这些动作发生的顺序吗?如果是这样,请不要使用Parallel.ForEach()
,因为无法保证调用它们的顺序(由于其多线程性质)。
编辑:
在您的示例中,这完全取决于有多少项目collection
以及流程繁重DoSomething()
。
这样做的原因是因为Parallel.ForEach()
不是免费的。需要权衡取舍。设置多线程环境需要时间,如果时间collection
很小和/或DoSomething()
不需要太长时间,那么设置这些线程所花费的时间会更好(通常更快)用于单线程异步操作。
另一方面,如果collection
是大型和/或DoSomething()
流程繁重的任务,那么Parallel.ForEach()
绝对是性能最高的选项。
推荐阅读
- javascript - 数组推送导致空数组javascript
- regex - 如何在 python 中使用正则表达式获取 RPM 安装的包名称和版本
- mongodb - 使用 Index 查询 MongoDb 的自定义键和值
- mysql - Laravel 订购当前到结束日期
- openshift - OpenShift3 在线 CPU 资源限制
- postgresql - 可以创建外键以指向 PostgreSQL 中日期范围版本表中的非唯一列吗?
- powershell - enter-pssession 的问题:“找不到接受参数的位置参数”
- sql - 获取每月 25 日后的第 6 个工作日加上 5 个工作日的语法错误
- dart - 在 Dart 中,将动态转换为给定类型或返回 null 的语法好方法?
- javascript - 如何在动态内部级别中仅获取 mongodb 中的一个字段?