2016-11-13 6 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. 私は3が正解だと思いますが、私はすべての時間を、コードを実行したときに私が得る

真:

私は最初のプリントが本当の理由を知っていますが、私はコードを常に実行します。私はFalseになりますか? (どのように私は2番目のプリントで真を得ることができますか?)

ありがとう!

+7

どのように最初のスレッドに戻ってくると思いますか? – SLaks

答えて

6

コンソールアプリケーションには同期コンテキストがないため、awaitは前のスレッドに戻ることができません。このため、Run2に別のスレッドIDが表示されています。

この詳細については、hereをご覧ください。

関連する問題