2016-11-13 130 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