gpt4 book ai didi

c# - async 和 await 如何替代现有方法?

转载 作者:行者123 更新时间:2023-11-30 21:43:13 25 4
gpt4 key购买 nike

来自 https://msdn.microsoft.com/en-us/library/mt674882.aspx#Threads :

The async-based approach to asynchronous programming is preferable to existing approaches in almost every case. In particular, this approach is better than BackgroundWorker for IO-bound operations because the code is simpler and you don't have to guard against race conditions. In combination with Task.Run, async programming is better than BackgroundWorker for CPU-bound operations because async programming separates the coordination details of running your code from the work that Task.Run transfers to the threadpool.

在我看来,一系列 async 函数最终必须以等待程序控制之外的事情发生而结束。一些 Internet 下载或用户输入或其他内容。

如果您的程序必须执行一些冗长的计算,情况会怎样?它必须在一个本身不使用 await 的方法中,因为当它自己完成所有工作时没有什么可等待的。如果不使用 await,那么控制不会返回到调用函数,对吗?如果是这种情况,那么它肯定根本就不是异步的。

似乎 BackgroundWorker 非常适合冗长的计算:https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx#Examples

有什么方法可以使用 async/await 来达到这个目的吗?

最佳答案

关键在这里:

In combination with Task.Run, async programming is better than BackgroundWorker for CPU-bound operations because async programming separates the coordination details of running your code from the work that Task.Run transfers to the threadpool.

对于 CPU-bound 的工作(或 IO-bound,没关系),Task.Run 将在线程池的单独线程中运行您的代码,因此当前代码可以 await 它,因为它在不同的线程上运行。从第二个线程的角度来看,工作是同步的,但从第一个线程的角度来看,工作是异步的。

第二件事是协调上下文。我没有使用过 BackgroundWorker,但根据我对文本的理解,它需要您手动检查工作是否完成,然后检索结果,或者传播异常,等等。在 async/await 方法中,所有这些都为您涵盖。

总而言之,与 BackgroundWorker 方式相比,async/await 方式似乎是一种更友好可读的处理方式。

编辑:

您不能在非等待 方法上使用await。受 CPU 限制的任务永远不可能是真正异步的,因为需要计算一些东西,为此需要一个线程。要么当前线程会进行计算(阻塞),要么将其交给另一个后台线程,因此当前线程不是阻塞和异步的。

如果您熟悉 Node.js,您会注意到处理受 CPU 限制的任务非常棘手,而且您经常需要重构代码。

但是,作为用户,无论您等待的方法是真正的异步方法还是使用另一个线程,您当前的线程都是异步的。

关于c# - async 和 await 如何替代现有方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41905748/

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