Типичные ошибки с async/await
Вопрос
Какие ошибки с async/await вы встречали и как их избежать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Блокировка через .Result и .Wait: дедлоки и голодание пула
async void вне обработчиков событий
Последовательные await вместо Task.WhenAll для независимых операций
Забытый await: fire-and-forget и потерянные исключения
Неиспользуемый CancellationToken
Параллельное использование одного DbContext из нескольких задач
Что могут спросить следом
- Как безопасно запустить фоновую работу в ASP.NET Core?
- Что будет, если не ждать задачу, которая бросила исключение?
Разбор
Первая ошибка: блокирующее ожидание. .Result и .Wait() в UI дают дедлок, а в ASP.NET Core под нагрузкой приводят к голоданию пула потоков: потоки заняты ожиданием, новые запросы встают в очередь. Правило: async до самого верха.
Вторая: async void в обычных методах. Исключение из него роняет процесс, а дождаться его нельзя. Третья: забытый await. Задача улетает в фоне, исключение теряется, а иногда метод ещё работает, когда запрос уже закончился и DbContext освобождён.
Четвёртая: последовательные await для независимых запросов вместо Task.WhenAll. Пятая: токен отмены принимают, но не передают дальше, и отмена запроса клиентом не останавливает работу. И отдельная беда: один DbContext в нескольких параллельных задачах, он не потокобезопасен и бросает исключение. Для фоновой работы в ASP.NET Core использую BackgroundService и очередь через Channel<T>, а не Task.Run из контроллера.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Как работает async/await под капотом
Следующий вопрос
Во что компилируется async-метод