Как используется ThreadPool в контексте async/await? Можно ли гарантировать тот же поток после await?

async/await не создаёт отдельный поток для каждой операции. После await продолжение может выполняться через ThreadPool, в захваченном контексте или синхронно, если операция уже завершена.

Короткий ответ

Что ответить на собеседовании

async/await не создаёт отдельный поток для каждой операции. После await продолжение может выполняться через ThreadPool, в захваченном контексте или синхронно, если операция уже завершена.

Подробный разбор

Ответ с пояснениями

async/await не создаёт отдельный поток для каждой операции. После await продолжение может выполняться через ThreadPool, в захваченном контексте или синхронно, если операция уже завершена.

Для I/O ожидание обычно обеспечивается асинхронным API, а не занятым потоком пула. Task.Run используется для передачи работы в ThreadPool, но нужен не для любого async-метода.

Тот же поток после await в общем случае не гарантируется. UI-контекст может вернуть продолжение в UI-поток; ConfigureAwait(false) убирает требование такого возврата, но не гарантирует переключение. Поэтому локальное состояние потока нельзя бездумно считать состоянием всей async-операции.

Источник: devblogs.microsoft.com.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее