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

Версия 6.3 от Alexandr Fokin на 2025/04/09 12:31

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