Почему async/await — отдельный блок на .NET-собесе
На Middle backend в 2026 async/await спрашивают почти всегда: не «что такое Task», а как это работает под капотом и где ломается production.
Интервьюер смотрит: понимаете ли разницу I/O-bound и CPU-bound, знаете ли про SynchronizationContext, не вызываете ли .Result / .Wait() в ASP.NET Core.
Базовый минимум (Middle)
Что такое async/await в C#
async — модификатор метода, который позволяет использовать await. await не блокирует поток — отдаёт управление, пока awaitable не завершится. Для I/O (HTTP, БД, файлы) это освобождает thread pool.
Task vs Task<T> vs ValueTask
Task/Task<T>— heap-аллокация, универсальный awaitable.ValueTask/ValueTask<T>— меньше аллокаций, когда результат часто синхронный (кэш, буфер). На собесе: «не злоупотреблять ValueTask без понимания, когда awaitable может быть reused».
ConfigureAwait(false)
В библиотечном коде — не захватывать контекст синхронизации. В ASP.NET Core с .NET 6+ контекст менее критичен, но вопрос «зачем false в library code» — классика.
Что любят спрашивать на Senior
Deadlock: .Result и .Wait()
Классический пример — sync-over-async:
var result = GetDataAsync().Result; — плохо в ASP.NET: deadlock или thread starvation.
Объяснение: sync-over-async блокирует поток, который нужен для продолжения async-метода → в UI был deadlock, в ASP.NET — starvation и latency.
Правильно: await до конца стека, или await GetDataAsync().ConfigureAwait(false) в legacy-коде, или рефакторинг на полностью async pipeline.
async void
Только для event handlers. На собесе: «почему исключения из async void не ловятся await'ом».
Parallel vs async
Task.WhenAll для параллельных I/O — да. Parallel.ForEach для CPU — да. Не путать: Parallel.ForEach + async lambda — антипаттерн без понимания.
CancellationToken
«Как отменить длинный запрос к БД при disconnect клиента?» — передать CancellationToken из HttpContext.RequestAborted в EF / HttpClient.
Типовые вопросы с хорошими ответами
Чем отличается await Task.Delay от Thread.Sleep?
Delay — async I/O timer, не блокирует поток. Sleep — блокирует текущий поток.
Сколько потоков создаёт async?
Ноль дополнительных «на каждый await» — продолжение планируется на thread pool (или I/O completion port).
Как работает state machine?
Компилятор генерирует struct/state machine с полями для локальных переменных и точек возврата. Не обязаны рисовать IL, но «это не магия потоков» — плюс.
Как готовиться за 3 дня
1. Перечитать Microsoft: async best practices.
2. Найти в своём коде все .Result / .Wait() — переписать или объяснить риск.
3. Разобрать 2 сценария: параллельные HTTP через WhenAll, отмена через CancellationToken.
4. Прогнать на mock-собеседовании — async часто ловят на live coding.
Связанные материалы
---
*Mock или консультация по async/ASP.NET Core — excalib.ru.*