c# - async await 不适合实现动态并行吗?

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

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

这就是背景。我还没弄清楚的是: 使用等待异步模式有优势还是劣势?我可以创建任务并使用阻塞调用(例如 Task.WaitAll 和 Task.WaitAny)等待它们,或者我可以创建任务并使用非阻塞调用(例如 Task.WhenAll 和 Task.WhenAny)等待它们。

我在各种网站上看到过使用 Task.Wait* 方法实现动态并行的建议(最著名的是 Stephen Cleary 的书“Concurrency in C# Cookbook”,第 3.4 章),但我不太明白为什么.在进行动态并行时使用阻塞调用是否有固有的优势? async/await 方法不会通过在等待被调用任务完成时释放调用任务来提供自己的优势吗?

最佳答案

动态并行性早于 asyncawait,它通常在需要阻塞的代码部分完成,但您可以 await CPU 密集型任务,就像您可以await I/O 密集型任务一样。

根据我的经验,大多数时候动态并行性使用 AttachedToParent,这会给任务隐式等待其所有子项。不是真正的 Wait,因为线程没有被阻塞,而是一种更 await 风格的 Wait。出于这个原因,我没有在我的动态并行代码中明确使用 await。但是,如果您不想阻塞调用线程,通常有一个顶级 await

关于c# - async await 不适合实现动态并行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56957183/

相关文章:

c# - 什么会导致我的 SQL Server 权限从存储过程的一次执行更改为下一次执行?

javascript - 自定义thenables : Can I create my own objects with a "then" method?

Angular 6 Async-await 无法处理 http 请求

c# - 使用任务并行库时线程数增长

c# - Task.Factory.StartNew 与 Task.Factory.FromAsync

c# - 将触发器的第一次触发时间设置为 StartAt() 中提到的日期

c# - async wait 使我的任务变慢,而 task.Start() 运行速度很快

c# - 在鼠标悬停时重新定位图像

javascript - 将异步函数的结果分配给同步函数中的变量

c# - 使用任务进行连续轮询