← Все гайды

C# / .NET

Async/await на собеседовании .NET: что спрашивают и как отвечать

Async/await на собесе .NET-разработчика: ConfigureAwait, deadlock, ValueTask, I/O vs CPU, типичные вопросы Middle/Senior backend и как отвечать с примерами из ASP.NET Core.

Почему 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.*