В чем отличие асинхронного подхода от синхронного?
Что проверяют
Понимаете ли вы, что асинхронность в .NET про освобождение потока на время ожидания, а не про параллельное выполнение. Следом почти всегда спрашивают, почему .Result в UI-приложении может подвесить программу и где в ASP.NET Core выигрыш от async.
Как отвечать
Синхронный вызов держит поток, пока операция не завершится: поток сидит и ждёт ответа сети или диска. Асинхронный через async/await запускает операцию и возвращает поток вызывающему, а остаток метода выполняется, когда результат готов. Во время ожидания I/O поток вообще не занят: ожидание обслуживает ОС (IOCP в Windows, epoll в Linux), а Task сообщает о результате.
Что стоит назвать:
- машина состояний: компилятор превращает
async-метод в state machine, каждыйawaitэто точка, где метод может приостановиться; - контекст синхронизации: в WPF и WinForms продолжение возвращается в UI-поток, в ASP.NET Core контекста нет и продолжение идёт в пул потоков. В библиотечном коде пишут
ConfigureAwait(false); - выигрыш: в UI интерфейс не замерзает, на сервере пул потоков не истощается под нагрузкой с медленной БД и внешними API, и один сервер держит больше одновременных запросов;
- асинхронно не значит параллельно: несколько операций одновременно запускают явно и ждут через
Task.WhenAll. CPU-задачи ускоряет неasync, аTask.Runв UI илиParallel.ForEach; - отмена и типы:
CancellationTokenпробрасывают по всей цепочке,ValueTaskуместен на горячих путях, которые часто завершаются синхронно.
Цена тоже есть: аллокации на state machine, более сложная отладка и «заразность» async по всей цепочке вызовов.
Где спотыкаются
Блокируют асинхронный код через .Result или .Wait(). В UI-потоке это классический дедлок: поток ждёт задачу, а задача ждёт этот поток для продолжения.
Пишут async void вне обработчиков событий. Исключение из такого метода не поймать через await, и оно роняет процесс.
Создают new HttpClient() в using на каждый запрос, как во многих примерах. Под нагрузкой это исчерпание сокетов, правильно брать IHttpClientFactory или один долгоживущий экземпляр.