异步等待是否不适合实现动态并行性?

时间:2019-07-09 16:43:18

标签: c# async-await task-parallel-library

我正在编写将在ASP.NET Core(2.2)上运行的服务。在请求/响应的上下文中执行的工作占用大量CPU,并且不依赖I / O或其他基于网络的服务。由于所执行工作的性质,动态并行似乎是最好的方法。这不是调用Parallel.ForEach的问题,而是根据需要创建和运行任务。

那是背景。我没有弄清楚的是: 使用await异步模式有什么优点或缺点?我可以使用Task.WaitAll和Task.WaitAny之类的阻塞调用创建Tasks并等待它们,也可以使用Task.WhenAll和Task.WhenAny之类的非阻塞调用来创建Tasks并等待它们。

我已经在各种网站上看到了建议(最引人注目的是在Stephen Cleary的书“ C#Cookbook中的并发性”的第3.4章中)使用Task.Wait *方法来实现动态并行性,但是我不太明白为什么。在进行动态并行处理时,使用阻塞调用有固有的优势吗?异步/等待方法不是通过在等待被调用任务完成时释放调用任务来提供自己的优势吗?

1 个答案:

答案 0 :(得分:1)

动态并行性早于asyncawait,并且通常在需要阻塞的部分代码中完成,但是您可以 await与CPU绑定的任务就像可以await与I / O绑定的任务一样。

根据我的经验,大多数情况下动态并行使用AttachedToParent,它使任务隐式等待所有子任务。这不是实际的Wait,因为没有阻塞线程,而是await风格更Wait的一种。因此,我在动态并行性代码中未明确使用await。但是,如果您不想阻塞调用线程,通常只有一个顶级await