C#Async Await永远不会返回主线程

时间:2017-11-29 19:59:27

标签: c# multithreading asynchronous

我写了一个非常简单的检查,告诉我我在做什么线程,然后添加了一些异步等待代码。我注意到我第一次检查我在thread1上,然后是thread3,我在代码执行期间从未返回到thread1。

有人可以向我解释为什么在等待之后我不会回到呼叫等待的主线程吗? aux的输出如下:

WhatThreadAmI()

示例代码:

**********************
Main - 17 -- True
**********************
**********************
CountAsync - 37 -- False
**********************
**********************
Main - 22 -- False
**********************
**********************
Main - 29 -- False
**********************

2 个答案:

答案 0 :(得分:1)

await将捕获当前同步上下文(SynchronizationContext.Current)并将继续(await之后的所有内容)发布到该上下文(除非您使用ConfigureAwait(false))。如果没有同步上下文,例如在控制台应用程序(您的情况)中 - 默认情况下将继续调度到线程池线程。您的主线程不是线程池线程,因此您永远不会在您发布的代码中返回它。

请注意,每个synhronization上下文实现都可以决定如何处理发布到它的回调,它没有必要将回调发布到单个线程(如WPF \ WinForms同步上下文那样)。因此,即使使用同步上下文,也不能保证"返回调用者线程"。

答案 1 :(得分:0)

即使您现在可以拥有异步主函数,但控制台应用程序仍然没有OperationContext。因此它将使用默认任务调度程序,它将在await之后导致继续使用任何线程池线程而不是与OperationContext关联的原始线程。