gpt4 book ai didi

c# - await 是否完全阻塞线程?

转载 作者:行者123 更新时间:2023-11-30 14:26:40 27 4
gpt4 key购买 nike

当我们在代码中使用 await 时,等待者通常会捕获上下文并在等待的任务成功完成时将其用作回调。但是,由于 await 通常是一个 No-Op(无操作),它是否会使底层线程在等待的任务执行完成之前不可重用?

例如:

public async Task MethodAAsync()
{
// Execute some logic
var test = await MethodB();
// Execute remaining logic
}

在这里,由于我需要返回结果才能继续进行,因此我需要等待它。但是,由于我们正在等待,它是否会阻塞底层线程导致线程未被用于执行任何任务?

最佳答案

But, since await is generally a No.Op(No Operation), does it make the underlying thread not being reusable until execution of awaited task completes?

我不确定你从哪里得到这些信息,但是 await 肯定不是 No-Op。例如,在 Task 上调用 await 将调用对 Task.GetAwaiter 的逻辑调用,其中 TaskAwaiter必须实现 INotifyCompletionICriticalNotifyCompletion 接口(interface),它告诉编译器如何调用延续(第一个 await 之后的所有内容)。

async-await 的完整结构将您的调用转换为状态机,这样当状态机触发第一个 await 时,它会首先检查以查看如果被调用的方法完成,如果没有,将注册延续并从该方法调用返回。稍后,一旦该方法完成,它将重新进入状态机以完成该方法。从逻辑上讲,这就是您在 await 被击中后看到的行。

But, since we are awaiting, does it block the underlying thread resulting thread not being used to execute any tasks?

不,创建一个完整的机制只是为了阻塞调用线程是没有用的。 async-await 允许您实际将调用线程返回给调用者,这允许他继续在同一线程上执行,而运行时负责排队和调用完成。

关于c# - await 是否完全阻塞线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34705703/

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