✏️ Async/Await в C# — шпаргалка
➡️ Что такое Task
Task — это обещание, что какое-то событие произойдёт в будущем. Не результат, а именно обещание.
Task<T> — то же самое, но с результатом типа T. Когда задача завершится, значение станет доступно.
Задача считается завершённой, когда событие произошло или значение получено. Проверить это можно через IsCompleted или Status.
➡️ Как дождаться результата
Правильно — асинхронно:
• await task — отпускает поток, пока задача не завершится. Поток свободен, приложение не зависает.
• ContinueWith(action) — задача сама вызовет ваш колбэк, когда завершится. Полезно, если нужно выстроить цепочку без await.
Неправильно — синхронно:
• task.Wait() и task.Result блокируют текущий поток до завершения задачи. Это неэффективно, ведь поток простаивает и опасно: риск дедлока в UI и ASP.NET-контекстах.
Единственное исключение: вызывать Wait или Result на уже завершённой задаче безопасно и дёшево — результат уже есть, блокировки не будет.
➡️ Что делает async
async — это флаг для компилятора: «в этом методе может встретиться await, подготовь конечный автомат». Не более того.
async без await внутри — бессмысленный метод. Он выполнится полностью синхронно, а компилятор при этом сгенерирует тяжёлый шаблонный код конечного автомата впустую.
async не запускает код в фоновом потоке. Если нужен фоновый поток — используйте Task.Run.
➡️ Что делает await
await — точка, в которой метод «разрезается» на до и после. Если задача ещё не завершена, управление возвращается вызывающему коду. Когда задача завершится — выполнение продолжится с того же места.
Без await ключевое слово async ничего не делает.
➡️ Частые ошибки
Вызов .Result или .Wait() в UI-потоке — дедлок. UI-поток заблокирован ожиданием, а задача не может завершиться, потому что ей нужен тот же UI-поток.
async void — допустим только для обработчиков событий. В остальных случаях используйте async Task. Исключения из async void невозможно поймать извне.
Забыли await — задача запустится, но никто не дождётся её завершения. Ошибки внутри неё потеряются молча.
async без await — компилятор предупредит, и правильно сделает. Метод синхронный, а обёртка в Task создаёт ложные ожидания у вызывающего кода.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_view
Post #7258
3.37K
- ❤ 19
- 👍 4
- 🥱 1