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

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

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

最佳答案

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

以我的经验,大多数时候动态并行使用AttachedToParent,它使任务隐式等待所有子进程。这不是实际的Wait,因为没有阻塞线程,而是await样式更多的Wait。因此,我不在动态并行性代码中显式使用await。但是,如果您不想阻塞调用线程,通常只有一个顶级await

09-20 09:42