[英]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 相比有很多不同:
房间里的大象: await Task.WhenAll
返回一个包含异步操作结果的数组。 相反, Parallel.ForEachAsync
返回一个裸Task
。 如果你想要结果,你必须依赖副作用,比如更新ConcurrentQueue<T>
作为异步操作的一部分。
Parallel.ForEachAsync
在ThreadPool
线程(可配置)上Parallel.ForEachAsync
调用提供的异步委托。 相反,使用Task.WhenAll
的常见模式是在当前线程上按顺序创建Task
。
Parallel.ForEachAsync
调用异步委托并等待生成的任务,同时强制执行等于Environment.ProcessorCount
的最大并发级别。 此限制可通过MaxDegreeOfParallelism
选项进行配置。 相反,使用Task.WhenAll
的常见模式是一次创建所有任务,没有并发限制。
Parallel.ForEachAsync
将在异步委托调用或创建的Task
上发生第一个错误时立即停止调用异步委托,然后在等待所有已创建的错误后传播包含迄今为止发生的所有错误的失败任务。 相反,使用Task.WhenAll
的常见模式是假设创建所有任务不可能中途失败,对这种可能性没有采取任何预防措施,并冒着泄漏即发即忘任务的风险,以防万一不可思议的事情发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.