我正在写一个将在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 *方法实现动态并行性,但是我不太明白为什么。在进行动态并行处理时,使用阻塞调用有固有的优势吗?异步/等待方法是否不会在等待被叫任务完成时释放其调用任务来提供自身的优势?
动态并行性早于async
和await
,并且通常在需要阻塞的代码的一部分中完成,但是您可以 await
像CPU绑定await
I / O一样,执行CPU绑定的任务。
以我的经验,大多数情况下动态并行使用AttachedToParent
,这使任务隐式等待所有子任务。这不是实际的Wait
,因为没有阻塞线程,而是一种更await
样式的Wait
。因此,我没有await
在动态并行性代码中明确使用。但它是共同拥有一个顶级await
如果你不想阻止调用线程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句