async / await方法在与调用者相同的线程中运行吗?

时间:2014-01-27 19:46:15

标签: c# async-await

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

1 个答案:

答案 0 :(得分:13)

  

我错过了什么吗?

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

对于WPF应用程序,当前SynchronizationContext设置为将调用封送回UI线程,这意味着它将最终在UI线程上。 (在Windows窗体中也是如此)。在控制台应用程序中,没有SynchronizationContext,因此它无法回发到该上下文,这意味着您将最终使用ThreadPool线程。

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