Традиционный шаблон кода для архитектуры, управляемой событиями, заключается в подключении событий к функциям (обратным вызовам) и реагировании на внешние триггеры.
Одним из преимуществ aysnc await является код, который обрабатывается линейно для лучшей читаемости.
Оба они верны, но они принципиально разные. Разница между «толкающей» системой и «вытягивающей» системой. В «активной» системе ваше приложение получает входящие события и должно реагировать на них. В «вытягивающей» системе ваше приложение обращается к какой-либо внешней системе и извлекает данные.
Системы на основе Push включают управляемую событиями архитектуру и System.Reactive (Reactive Extensions / Rx).
Системы на основе Pull включают async
/ await
и предстоящие «асинхронные потоки».
Нет ничего плохого в использовании событий (или Rx) для обработки событий на основе push. Я бы не стал менять код просто на «использование async
». Тем не менее, некоторый код может быть лучше понят при написании с ориентацией на основе извлечения, и в этом случае вы можете создать мост.
Для того, чтобы соединить толчок и тягу, вам нужна какая-то система буфера или противодавления. Доступно несколько таких систем, например, System.Threading.Channels и TPL Dataflow, а также некоторые Rx-операторы. Таким образом, вы можете, например, иметь событие (на основе push), которое записывает сообщения в канал, который буферизует каждое сообщение, и иметь отдельное async
считыватель (на основе pull), который читает эти сообщения из канала и обрабатывает их.