➡️ Что такое 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
