Skip to content

Instantly share code, notes, and snippets.

@RSa-Dev
Last active October 2, 2023 15:35
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RSa-Dev/64ed0d769584f47a5cabf452057e37d6 to your computer and use it in GitHub Desktop.
Save RSa-Dev/64ed0d769584f47a5cabf452057e37d6 to your computer and use it in GitHub Desktop.
Подсказки по C# Async-Await

Сводное описание принципов асинхронного программирования

Название Описание Исключения
Избегайте async void Async должны возвращать Task, а не void Обработчики событий
Async от начала до конца Не смешивайте блокирующий и async код Метод main консольной программы
Конфигурируйте контекст ConfigureAwait(false) всегда, если можно Методы, требующие передачи контекста

«Асинхронный стиль» работы (начиная с 4.5)

Если нужно... Вместо этого... Применять...
Получить результат фоновой задачи 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 (4.0) к async/await (4.5)

Читаем 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

Источник

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment