c# - async/await 方法是否与调用方在同一个线程中运行?

标签 c# async-await

我读到 async/await 方法与调用方在同一线程中运行,我在 WPF 应用程序中看到它,但在控制台应用程序中测试代码时,我发现它与调用方在不同的线程中运行。 我错过了什么吗? enter image description here

最佳答案

Have I missed something?

有点。 await线程一无所知。它会导致 await 关键字后的代码(默认情况下)在与调用方相同的 SynchronizationContext 中运行(如果存在)。

在 WPF 应用程序的情况下,当前的 SynchronizationContext 被设置为将调用编码回 UI 线程,这意味着它将在 UI 线程上结束。 (在 Windows 窗体中也是如此)。在控制台应用程序中,没有 SynchronizationContext,因此它无法回发到该上下文,这意味着您最终将进入 ThreadPool 线程。

如果您要将自定义 SynchronizationContext 安装到 SynchronizationContext.Current 中,调用将发布到那里。然而,这在控制台应用程序中并不常见,因为它通常需要存在“消息循环”之类的东西才能正常工作。

关于c# - async/await 方法是否与调用方在同一个线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21390186/

相关文章:

c# - 检测 WPF 文本框在粘贴文本后何时完成渲染

c# - 在 .Net 中,在键盘、上键或下键中编写按键代码的更好选择是什么?

c# - 如何在 ASP.NET Core 中对 void 方法使用异步/等待?

c# - 如何在 DOTween 中实现异步?

c# - LINQ - 无法从 select 中的用法推断出类型参数

c# - 如何通过IConfiguration知道JSON数组的长度?

c# - 什么时候等待动态调用的方法?

javascript - 如何等待js导出的api调用?

async-await - 无服务器授权器异步等待不起作用

c# - 按下回车键时如何关闭WPF窗口(对话框)?