gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:26:18 24 4
gpt4 key购买 nike

我正在编写将在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com