2016-11-13 4 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. Правда

    Иногда Правда иногда ложь.

  4. Правда

    Правда

Я думаю, что 3 правильный ответ, но когда я запускаю код все время я получаю:

Правда

Ложные

Я знаю, почему первый шрифт True, но каждый может объяснить мне, почему я запускаю код всегда, я получаю False? (как я могу получить True во второй печати?)

Thank!

+7

Как вы ожидаете, что он вернется к первому потоку? – SLaks

ответ

6

Консольные приложения не имеют контекста синхронизации, поэтому await не может вернуться к предыдущей теме. Вот почему вы видите другой идентификатор потока в Run2.

Подробнее об этом можно узнать здесь here.

Смежные вопросы