Выбор ответа Senior async/await и Task обновлено
Во что компилируется async-метод
Вопрос
Во что компилятор превращает async-метод?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В машину состояний с MoveNext, где локальные переменные стали полями. Компилятор генерирует машину состояний (в Release это структура, которая переезжает в кучу только при первом реальном ожидании).
Варианты ответа
- В отдельный поток с циклом ожидания завершения каждого
await - В цепочку вызовов
ContinueWithпрямо в теле исходного метода - В метод, который всегда выполняется на пуле потоков целиком
- В машину состояний с
MoveNext, где локальные переменные стали полямиправильный ответ
Разбор
Компилятор генерирует машину состояний (в Release это структура, которая переезжает в кучу только при первом реальном ожидании). Локальные переменные, живущие через await, становятся её полями. MoveNext выполняет код до очередного незавершённого await, запоминает номер состояния и подписывает себя продолжением. Потоков он не создаёт. ContinueWith в сгенерированном коде не используется, применяются awaiter-ы (GetAwaiter, OnCompleted).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.