Выбор ответа Senior async/await и Task обновлено

Во что компилируется async-метод

Вопрос

Во что компилятор превращает async-метод?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: В машину состояний с MoveNext, где локальные переменные стали полями. Компилятор генерирует машину состояний (в Release это структура, которая переезжает в кучу только при первом реальном ожидании).

Варианты ответа

  1. В отдельный поток с циклом ожидания завершения каждого await
  2. В цепочку вызовов ContinueWith прямо в теле исходного метода
  3. В метод, который всегда выполняется на пуле потоков целиком
  4. В машину состояний с MoveNext, где локальные переменные стали полямиправильный ответ

Разбор

Компилятор генерирует машину состояний (в Release это структура, которая переезжает в кучу только при первом реальном ожидании). Локальные переменные, живущие через await, становятся её полями. MoveNext выполняет код до очередного незавершённого await, запоминает номер состояния и подписывает себя продолжением. Потоков он не создаёт. ContinueWith в сгенерированном коде не используется, применяются awaiter-ы (GetAwaiter, OnCompleted).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме