Самые Частые Ошибки при Работе с async/await. Продолжение 5-7
Начало
5. Не ожидать Task в выражении using
System.Threading.Tasks.Task реализует интерфейс IDisposable. Вызов метода, возвращающего Task, непосредственно в выражении using приводит к удалению задачи в конце блока using, что никогда не является ожидаемым поведением.❌ Неверно
using (CreateDisposableAsync()) {
…
}
✅ Верноusing (await CreateDisposableAsync()) {
…
}
6. Не ожидать Task в блоке usingЕсли мы пропустим ключевое слово
await для асинхронной операции внутри блока using, то объект может быть удалён до завершения асинхронного вызова. Это приведёт к неправильному поведению и очень часто заканчивается исключением времени выполнения, сообщающим о том, что мы пытаемся работать с уже удалённым объектом.❌ Неверно
private Task<int> DoSomething() {
using (var service = CreateService()) {
return service.GetAsync();
}
}
✅ Верноprivate async Task<int> DoSomething() {
using (var service = CreateService()) {
return await service.GetAsync();
}
}
7. Не ожидать результата асинхронного методаОтсутствие ключевого слова await перед асинхронной операцией приведет к завершению метода до завершения данной асинхронной операции. Метод будет вести себя непредсказуемо, и результат будет отличаться от ожиданий. Ещё хуже, если неожидаемое выражение выбросит исключение. Оно остается незамеченным и не вызовет сбоя процесса, что ещё больше затруднит его обнаружение. Вы всегда должны ожидать асинхронное выражение или присвоить возвращаемую задачу переменной и убедиться, что в итоге она где-то ожидается.
❌ Неверно
async Task DoSomethingAsync() {
await DoSomethingAsync1();
DoSomethingAsync2();
await DoSomethingAsync3();
}
✅ Верноasync Task DoSomethingAsync() {
await DoSomethingAsync1();
await DoSomethingAsync2();
await DoSomethingAsync3();
}
Продолжение следует…Источник: https://cezarypiatek.github.io/post/async-analyzers-p1/