TPL_Dataflow, Blocks
В контексте 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, но генерирует ноль, один или несколько выходных элементов на один входящий (аналог LINQSelectMany). [1, 2]
2. Буферизующие блоки (Buffering Blocks)
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]
Комментариев нет:
Отправить комментарий