2016-11-13 104 views
3

我有以下代码:异步 - 等待 - 线程预期

static void Main(string[] args) 
    { 
     Run1(); 
     Run2().Wait(); 
    } 

    static async Task DoAsyncWork() 
    { 
     await Task.Delay(2000); 
    } 

    static async Task Run2() 
    { 
     var tid = Thread.CurrentThread.ManagedThreadId; 
     await DoAsyncWork(); 
     Console.WriteLine(tid == Thread.CurrentThread.ManagedThreadId); 
    } 

    static void Run1() 
    { 
     var tid = Thread.CurrentThread.ManagedThreadId; 
     DoAsyncWork().Wait(); 
     Console.WriteLine(tid == Thread.CurrentThread.ManagedThreadId); 
    } 

会有怎样的输出:

  1. 有时候真有时候假的。

  2. 有时候真有时候假的。

我觉得3是正确的答案,但是当我运行代码的所有时间我得到:

我知道为什么第一次印刷是真的,但任何人都可以解释为什么什么时候我运行的代码总是我得到假? (我如何在第二次印刷中获得True)

谢谢!

+7

你如何期待它回到第一个线程? – SLaks

回答

6

控制台应用程序没有同步上下文,因此await无法返回到上一个线程。这就是为什么你在Run2中看到不同的线程ID。

您可以阅读更多关于此here