Название | Описание | Исключения |
---|---|---|
Избегайте async void | Async должны возвращать Task, а не void | Обработчики событий |
Async от начала до конца | Не смешивайте блокирующий и async код | Метод main консольной программы |
Конфигурируйте контекст | ConfigureAwait(false) всегда, если можно |
Методы, требующие передачи контекста |
Если нужно... | Вместо этого... | Применять... |
---|---|---|
Получить результат фоновой задачи | Task.Wait or Task.Result |
await |
Ожидать завершения любой из задач | Task.WaitAny |
await Task.WhenAny |
Получить результаты всех задач | Task.WaitAll |
await Task.WhenAll |
Ожидать период времени (пауза) | Thread.Sleep |
await Task.Delay |
Проблема | Решение |
---|---|
Создание задачи для выполнения кода | Task.Run or TaskFactory.StartNew (не конструктор Task , не Task.Start ) |
Создание оболочки задачи для операции или события | TaskFactory.FromAsync или TaskCompletionSource<T> |
Поддержка отмены | CancellationTokenSource и CancellationToken |
Отчёт о прогрессе | IProgress<T> и Progress<T> |
Обработка потоков данных | TPL Dataflow или Reactive Extensions |
Синхронизация доступа к общему ресурсу | SemaphoreSlim |
Асинхронная инициализация ресурса | AsyncLazy<T> |
"Провайдер-потребитель" с поддержкой async | TPL Dataflow или AsyncCollection<T> |
Читаем Task-based Asynchronous Pattern (TAP) document. Там всё написано, как про разработку API, так и про использование async/await, включая отмену и отчёт о прогрессе.
Несколько новых приёмов для await, которые должны использоваться вместо старого блокирующего кода. Если какие-либо из старых техник у вас найдутся внутри async кода, то "что-то пошло не так":
Раньше | Теперь | Описание |
---|---|---|
task.Wait |
await task |
Ожидать завершения Task 'а |
task.Result |
await task |
Получить результат завершённого Task 'а |
Task.WaitAny |
await Task.WhenAny |
Ожидать завершения одного(любого) Task 'a из коллекции |
Task.WaitAll |
await Task.WhenAll |
Ожидать завершения всех (последнего) Task 'a из коллекции |
Thread.Sleep |
await Task.Delay |
Ждать заданный период времени |
КонструкторTask |
Task.Run или TaskFactory.StartNew |
Создать Task в коде |
Источник http://blog.stephencleary.com/2012/02/async-and-await.html
Источник