Какой поток запускает код после ключевого слова `await`?

Позвольте мне просто опубликовать простой пример:

    private void MyMethod()
    {
        Task task = MyAsyncMethod();
        task.Wait();
    }

    private async Task MyAsyncMethod()
    {
        //Code before await
        await MyOtherAsyncMethod();
        //Code after await
    }

Допустим, я запускаю приведенный выше код в однопоточном приложении, например в консольном приложении. Мне трудно понять, как код //Code after await сможет работать.

Я понимаю, что когда я нажимаю ключевое слово await в элементе управления MyAsyncMethod(), происходит возврат к MyMethod(), но затем я блокирую поток с помощью task.Wait(). Если поток заблокирован, как вообще может работать //Code after await, если поток, который должен принять его, заблокирован?

Создается ли новый поток для запуска //Code after await? Или основной поток волшебным образом выходит из task.Wait() для запуска //Code after await?

Я не уверен, как это должно работать?

8
задан AxiomaticNexus 23 October 2013 в 02:37
поделиться