我读到 async/await 方法与调用方在同一线程中运行,我在 WPF 应用程序中看到它,但在控制台应用程序中测试代码时,我发现它与调用方在不同的线程中运行。 我错过了什么吗?
最佳答案
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/