Есть ли такой блок потока данных, как TransformBlock ‹TIn, TOut›, который позволяет передавать элементы вне последовательности?

Я относительно новичок в асинхронной обработке и экспериментирую с TPL Dataflow. Мой сценарий: у меня есть блок, который постоянно получает входные данные, асинхронно выполняет функцию на входе и возвращает результаты. (Результаты затем передаются в другой блок, который сохраняется в базе данных.) Функция может завершиться за миллисекунды или возврат может занять до 10 секунд. Блок настроен на обработку с «неограниченным» параллелизмом. Порядок результатов не имеет значения.

Я начал использовать TransformBlock, но (поскольку он поддерживает последовательность элементов) один медленный элемент может вызвать скопление множества более быстрых элементов за ним. В этой конкретной ситуации не только допустимо, чтобы результаты распространялись вне последовательности, но и очень желательно. Это позволяет получать результаты с регулярной скоростью, а не гигантскими волнами.

Я искал несколько раз в поисках реализации блока потока данных, который распространяет элементы сразу после их завершения, но я еще не нашел ничего, что соответствовало бы этому описанию. Я сдался и создал свой собственный NonSequentialBlock, "склеив изолентой" вместе ActionBlock и BufferBlock. Кажется, это работает, но меня беспокоит, что (из-за отсутствия опыта) я сделал что-то не так, и в конце концов это меня укусит. Доступна ли существующая реализация этого шаблона?


person Michael Richardson    schedule 11.12.2014    source источник
comment
ActionBlock отправляет сообщение в BufferBlock?   -  person i3arnon    schedule 11.12.2014
comment
@ I3arnon Верно.   -  person Michael Richardson    schedule 11.12.2014


Ответы (2)


Нет, ты не сделал ничего плохого. Обычно собственные блоки создаются путем объединения базовых блоков с последующим вызовом Encapsulate, чтобы ... инкапсулировать их и представить один блок IPropagator.

person Panagiotis Kanavos    schedule 11.12.2014
comment
Это должно работать отлично. Я понятия не имел, что метод Encapsulate существует. Спасибо! - person Michael Richardson; 11.12.2014

Новый параметр EnsureOrdered был добавлен в DataflowBlockOptions класс, который определяет, будет ли блок потока данных выводить обработанные результаты в порядке входных сообщений. По умолчанию это свойство равно true. Установка этого свойства в false заставляет блок распространять сообщения сразу после их обработки, игнорируя их исходный порядок.

Эта опция была представлена ​​в 2016 году.

person Theodor Zoulias    schedule 31.08.2020