async/await не создаёт отдельный поток для каждой операции. После await продолжение может выполняться через ThreadPool, в захваченном контексте или синхронно, если операция уже завершена.
Как используется ThreadPool в контексте async/await? Можно ли гарантировать тот же поток после await?
async/await не создаёт отдельный поток для каждой операции. После await продолжение может выполняться через ThreadPool, в захваченном контексте или синхронно, если операция уже завершена.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
async/await не создаёт отдельный поток для каждой операции. После await продолжение может выполняться через ThreadPool, в захваченном контексте или синхронно, если операция уже завершена.
Для I/O ожидание обычно обеспечивается асинхронным API, а не занятым потоком пула. Task.Run используется для передачи работы в ThreadPool, но нужен не для любого async-метода.
Тот же поток после await в общем случае не гарантируется. UI-контекст может вернуть продолжение в UI-поток; ConfigureAwait(false) убирает требование такого возврата, но не гарантирует переключение. Поэтому локальное состояние потока нельзя бездумно считать состоянием всей async-операции.
Источник: devblogs.microsoft.com.