четверг, 11 июня 2026 г.

Tpl, Dataflow, EventBased, Boook

Tpl, Dataflow, EventBased

https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/dataflow-task-parallel-library

D:\downloads\MS\dotnet-navigate-advanced-programming.pdf

В контексте TPL Dataflow (пространство имен System.Threading.Tasks.Dataflow) нет отдельных сущностей, которые называются «каналами» или «потоками» (threads). Вместо этого концепции каналов и обработки данных реализуются через блоки (Blocks). Блоки соединяются в цепочки (пайплайны), образуя потоки данных. [1, 2, 3]
Библиотека предоставляет предопределенные блоки, классифицируемые по функционалу: [1]
1. Блоки-исполнители (Execution Blocks)
Отвечают за обработку, преобразование и выполнение действий над входящими сообщениями. Именно они выполняют основную бизнес-логику. [1]
  • ActionBlock<T> — принимает данные и выполняет над ними синхронный или асинхронный код (например, сохранение в базу данных или отправка HTTP-запроса). Возвращаемого значения нет. [1, 2]
  • TransformBlock<TInput, TOutput> — принимает элемент одного типа, трансформирует его и передает дальше элемент другого типа (выходное значение). Классический блок для обработки. [1, 2]
  • TransformManyBlock<TInput, TOutput> — похож на Transform, но генерирует ноль, один или несколько выходных элементов на один входящий (аналог LINQ SelectMany). [1, 2]
2. Буферизующие блоки (Buffering Blocks)
Служат для хранения, распределения и контроля пропускной способности (backpressure). [1, 2]
  • BufferBlock<T> — действует как классическая потокобезопасная очередь. Сохраняет сообщения и выдает их потребителям (например, для регулирования потока между быстрым и медленным этапом). [1, 2, 3]
  • BroadcastBlock<T> — рассылает (дублирует) одно и то же входящее сообщение всем привязанным к нему блокам. Сообщение сохраняется до прихода нового. [1, 2]
  • WriteOnceBlock<T> — буферизует и принимает только самый первый отправленный элемент. Все последующие попытки записи игнорируются (идеально для кэширования конфигураций или флагов инициализации). [1]
3. Группирующие блоки (Grouping Blocks)
Объединяют сообщения из одного или нескольких источников в наборы или кортежи. [1]
  • BatchBlock<T> — накапливает определенное количество входящих элементов и выпускает их дальше в виде массива (например, для отправки пачки записей в БД).
  • JoinBlock<T1, T2...> — принимает данные из разных источников и объединяет их в кортеж, дожидаясь поступления данных от каждого источника.
  • BatchedJoinBlock<T1, T2...> — объединяет батчинг и объединение данных, накапливая кортежи из разных источников за определенное время или при достижении лимита. [1, 2, 3]

Архитектурные интерфейсы (потоки связей)
Связи между блоками в TPL Dataflow классифицируются по направлению передачи данных (интерфейсам, которые они реализуют): [1]
  • ITargetBlock<T> — представляет целевой блок (входной канал). В него можно только отправлять данные методами Post() или SendAsync().
  • ISourceBlock<T> — представляет исходный блок (выходной канал). Из него можно только считывать/забирать данные или связывать с целевыми блоками.
  • IPropagatorBlock<TInput, TOutput> — комбинированный блок. Является одновременно и источником, и целью. Через такие блоки данные проходят (транзитные звенья конвейера, например, TransformBlock). [1, 2, 3, 4]
Для создания собственной ветки или конвейера эти блоки связываются друг с другом с помощью метода .LinkTo(). [1, 2]

Комментариев нет:

Отправить комментарий