Исходный код вики Асинхронность. Async Await

Редактировал(а) Alexandr Fokin 2025/04/09 12:46

Скрыть последних авторов
Alexandr Fokin 5.4 1 |(% style="width:177px" %)Подходы к реализации асинхронного кода.|(% style="width:1308px" %)(((
Alexandr Fokin 3.3 2 На протяжении истории существовало несколько подходов к реализации асинхронного кода. Подход на основе async-await является наиболее молодым.
3 Зачастую асинхронность связана с операциями ввода/вывода (Файловая система, Базы данных, Http запросы, операция ожидания (Task.Delay) и другое), где присутствует сравнительно большое ожидание в котором поток не задействован.
Alexandr Fokin 2.1 4
Alexandr Fokin 5.4 5 Шаблоны асинхронного программирования
6 [[https:~~/~~/docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/>>https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/]]
7
Alexandr Fokin 6.3 8 |(% style="width:233px" %)(((
Alexandr Fokin 3.3 9 APM
Alexandr Fokin 6.6 10 )))|(% style="width:1052px" %)Begin - End
11 Блокирующий подход.
12 |(% style="width:233px" %)Event-based Asynchronous|(% style="width:1052px" %)Callback, event.
Alexandr Fokin 6.8 13 Callback:
Alexandr Fokin 6.6 14 Неблокирующий подход, но код менее удобный и менее читаемый.
Alexandr Fokin 6.7 15 И если рассмотреть обработку запроса, то в конце обработки все равно нужно будет синхронно (блокирующе) дождаться всех асинхронных задач.
Alexandr Fokin 6.6 16 |(% style="width:233px" %)TAP (Task-based asynchronous)|(% style="width:1052px" %)Task (Promise/Feature)
Alexandr Fokin 3.3 17 Async Await
Alexandr Fokin 6.6 18 [[SynchronizationContext ~~| Контекст синхронизации>>Разработка.NET.C#.Многопоточность и асинхронность.Асинхронность\. Async Await.SynchronizationContext | Контекст синхронизации.WebHome]].
19 Неблокирующий подход, при этом код пишется в синхронном (последовательном) виде.
Alexandr Fokin 6.5 20 |(% style="width:233px" %)Green threads|(% style="width:1052px" %)Подход к механизму, когда на уровне кода не используется никаких дополнительных пометок о асинхронном исполнении, а ответственность за выявление асинхронных блоков и их обработка (асинхронное неблокирующее ожидание) лежит на среде выполнения приложения.
Alexandr Fokin 6.3 21 Можно сказать, что формат кода приближен к шаблону TAP, но не требуется указывать в коде async методы и await - места ожидания.
Alexandr Fokin 5.4 22 )))
Alexandr Fokin 5.6 23 |(% style="width:177px" %)Подробнее о
24 TAP ~| Async/Await|(% style="width:1308px" %)(((
Alexandr Fokin 2.1 25 Более мягкий подход к асинхронности.
Alexandr Fokin 5.6 26 Асинхронный код записывается в синхронном виде (Выглядит последовательно), но при этом в момент выполнения асинхронного кода, выполняющий поток не блокируется, а освобождается и может выполнять другие задачи.
Alexandr Fokin 2.1 27
Alexandr Fokin 5.4 28
Alexandr Fokin 6.1 29 |(% style="width:79px" %)Desktop (GUI)|(% style="width:1443px" %)Позволяет не блокировать UI (зависание основного потока во время выполнения долгих операций [[Event loop>>doc:Архитектура и модели.Модели.Event loop.WebHome]]).
Alexandr Fokin 5.6 30 Когда встречается реальная асинхронная операция UI Thread освобождается и идет обрабатывать другие события графического интерфейса. После того, как асинхронная операция будет завершена, код идущей за ней может продолжить выполнение в UI Thread (или в другом потоке из пула).
Alexandr Fokin 3.3 31 |(% style="width:79px" %)Web|(% style="width:1443px" %)(((
Alexandr Fokin 5.6 32 Позволяет обрабатывать большее кол-во параллельных задач (запросов) меньшим кол-во потоков.
33 (Поток обрабатывает запрос, сталкивается с асинхронной операцией, освобождается (возвращается в пул) и может обработать другие входящие запросы. При окончании асинхронной операции тот-же или другой поток из пула продолжит выполнение).
Alexandr Fokin 2.1 34
Alexandr Fokin 3.3 35 Т.е. прирост не в скорости работы, а в пиковой нагрузке по кол-ву соединений, за счет освобождения потоков, ожидающих завершения асинхронных операций.
36 При этом присутствуют небольшие накладные расходы, связанные с работой Async/Await.
Alexandr Fokin 5.6 37
38 Позволяет пулу потоков обходиться меньшим количеством потоков за счет отсутствия (бесполезной) блокировки потока на ожидании завершения асинхронной операции.
Alexandr Fokin 3.3 39 )))
Alexandr Fokin 5.4 40 )))
41 |(% style="width:177px" %)Материалы:|(% style="width:1308px" %)(((
42 |(% style="width:106px" %)Книги|(% style="width:1184px" %)(((
43 * [[Асинхронное программирование в C# 5.0 | O’Reilly>>doc:Книги.O’Reilly.Асинхронное программирование в C# 5\.0 | O’Reilly.WebHome]]
44 * [[CLR via C# | Джеффри Рихтер>>doc:Книги.CLR via C# | Джеффри Рихтер.WebHome]]
45 )))
46 |(% style="width:106px" %)Статьи|(% style="width:1184px" %)(((
47 * Async/await в C#: концепция, внутреннее устройство, полезные приемы
48 [[https:~~/~~/habr.com/ru/post/470830/>>https://habr.com/ru/post/470830/||style="background-color: rgb(255, 255, 255);"]]
49 * Асинхронные методы, async и await
50 [[https:~~/~~/metanit.com/sharp/tutorial/13.3.php>>https://metanit.com/sharp/tutorial/13.3.php]]
51 * Асинхронный рассинхрон: антипаттерны в работе с async/await в .NET
52 [[https:~~/~~/habr.com/ru/company/dododev/blog/435666/>>https://habr.com/ru/company/dododev/blog/435666/]]
53 * Async/await в C#: подводные камни
54 [[https:~~/~~/habr.com/ru/post/257221/>>https://habr.com/ru/post/257221/]]
55 * Async/await и механизм реализации в C# 5.0
56 [[https:~~/~~/habr.com/ru/post/260217/>>https://habr.com/ru/post/260217/]]
57 * Async/await in C#: pitfalls
58 https://enterprisecraftsmanship.com/posts/pitfalls-of-async-await/
59 * Асинхронность в C#. Разрушение легенд
60 https://techrocks.ru/2020/01/11/asynchrony-in-c-sharp/
Alexandr Fokin 6.2 61 * RadioDotNet. Async practices, breaking changes, time provider
62 [[https:~~/~~/www.youtube.com/watch?v=f4-gb-cg_MQ&list=PLbxr_aGL4q3SpQ9GRn2jv-NEpvN23CUC5>>https://www.youtube.com/watch?v=f4-gb-cg_MQ&list=PLbxr_aGL4q3SpQ9GRn2jv-NEpvN23CUC5]]
Alexandr Fokin 5.4 63 )))
64 )))
65
Alexandr Fokin 3.3 66 ----
Alexandr Fokin 2.1 67
Alexandr Fokin 3.10 68 ==== Внутренние ссылки: ====
Alexandr Fokin 2.1 69
Alexandr Fokin 3.10 70 ====== Дочерние страницы: ======
71
72 {{children/}}
73
74 ====== Обратные ссылки: ======
75
76 {{velocity}}
77 #set ($links = $doc.getBacklinks())
78 #if ($links.size() > 0)
79 #foreach ($docname in $links)
80 #set ($rdoc = $xwiki.getDocument($docname).getTranslatedDocument())
81 * [[$escapetool.xml($rdoc.fullName)]]
82 #end
83 #else
84 No back links for this page!
85 #end
86 {{/velocity}}
87
Alexandr Fokin 5.4 88