我已经读过async / await方法在与调用者相同的线程中运行,我在WPF应用程序中看到它但在测试控制台应用程序中的代码时,我发现它在与调用者不同的线程中运行。 我错过了什么吗?
答案 0 :(得分:13)
我错过了什么吗?
排序。 await
对线程一无所知。它会导致await
关键字之后的代码(默认情况下)与调用者在SynchronizationContext
中运行(如果存在)。
对于WPF应用程序,当前SynchronizationContext
设置为将调用封送回UI线程,这意味着它将最终在UI线程上。 (在Windows窗体中也是如此)。在控制台应用程序中,没有SynchronizationContext
,因此它无法回发到该上下文,这意味着您将最终使用ThreadPool线程。
如果您要将自定义SynchronizationContext
安装到SynchronizationContext.Current
,那么电话会在那里发布。然而,这在控制台应用程序中并不常见,因为它通常需要存在类似“消息循环”的东西才能正常工作。