繁体   English   中英

Parallel.ForEachAsync 是普通 for 循环的替代品 + 附加到任务列表 + WhenAll 还是 Task.Run()?

[英]Is Parallel.ForEachAsync a replacement to a plain for loop + append to task list + WhenAll OR Task.Run()?

假设我想发出并行 API 发布请求。

在 for 循环中,我可以将 http post 调用附加到任务列表中,然后使用await Task.WhenAll等待所有任务完成。 因此,在等待网络请求完成时,控件将转到调用者。 有效地,API 请求将并行进行。

同样,我可以使用Parallel.ForEachAsync它将自动执行WhenAll并将控制权返回给调用者。 所以我想问一下ForEachAsync是否可以替代普通的 for 循环列表和WhenAll

或者它可能是async / await + Task.Run()的替代品?

不,(目前尚未发布) Parallel.ForEachAsync API 与简单使用Task.WhenAll API 相比有很多不同:

  1. 房间里的大象: await Task.WhenAll返回一个包含异步操作结果的数组。 相反, Parallel.ForEachAsync返回一个裸Task 如果你想要结果,你必须依赖副作用,比如更新ConcurrentQueue<T>作为异步操作的一部分。

  2. Parallel.ForEachAsyncThreadPool线程(可配置)上Parallel.ForEachAsync调用提供的异步委托。 相反,使用Task.WhenAll的常见模式是在当前线程上按顺序创建Task

  3. Parallel.ForEachAsync调用异步委托并等待生成的任务,同时强制执行等于Environment.ProcessorCount的最大并发级别。 此限制可通过MaxDegreeOfParallelism选项进行配置。 相反,使用Task.WhenAll的常见模式是一次创建所有任务,没有并发限制。

  4. Parallel.ForEachAsync将在异步委托调用或创建的Task上发生第一个错误时立即停止调用异步委托,然后在等待所有已创建的错误后传播包含迄今为止发生的所有错误的失败任务。 相反,使用Task.WhenAll的常见模式是假设创建所有任务不可能中途失败,对这种可能性没有采取任何预防措施,并冒着泄漏即发即忘任务的风险,以防万一不可思议的事情发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM