Поток данных TPL прерывает LinkTo() во время выполнения

У меня есть TransformManyBlock<Tin, Tout>, и во время выполнения я добавляю потребителей (ActionBlocks) через LinkTo(...).

  1. Является ли TransformManyBlock правильным блоком потока данных для потребления элементов, их преобразования и последующего вывода (вывод элементов с тем же количеством элементов, что и ввод) нескольким потребителям (каждый потребитель, связанный с, потребляет идентичные элементы, такие как широковещательная рассылка)? Я намеренно не выбрал BroadCastBlock, потому что он не может преобразовывать элементы так же, как BufferBlock.

  2. Мне нравится знать, как я могу отключить потребителей (здесь ActionBlocks) во время выполнения? Насколько я вижу, LinkTo() не предоставляет такой функциональности.


person Matt    schedule 21.08.2012    source источник


Ответы (1)


  1. TransformManyBlock предназначен для преобразования одного элемента на входе в несколько элементов на выходе, он не имеет ничего общего с количеством потребителей.

    Если вы хотите выполнить преобразование отдельно для каждой цели, то именно для этого и предназначено cloningFunction в BroadcastBlock.

    Если вы хотите выполнить преобразование один раз, а затем отправить каждой цели один и тот же объект, вы можете объединить TransformBlock и BroadcastBlock, связав их вместе. Предмет будет преобразован TransformBlock, а затем отправлен всем целям BroadcastBlock.

  2. #P4# <блочная цитата> #P5# #P6#
person svick    schedule 21.08.2012
comment
Является ли BroadcastBlock единственным блоком, который может это сделать? Я считаю, что это добавляет накладные расходы, потому что он не делает ничего, кроме простого клонирования (применительно к моему примеру). Я надеялся, что смогу найти что-то, что может не добавить таких накладных расходов. 2. Именно то, что я искал, спасибо. - person Matt; 21.08.2012
comment
Является ли BroadcastBlock единственным встроенным блоком, который отправляет каждое сообщение всем своим целям? Да. (WriteOnceBlock тоже это делает, но очень ограниченно.) Если накладные расходы BroadcastBlock действительно для вас слишком велики, вам придется создать свой собственный блок, объединяющий TransformBlock и BroadcastBlock, или что-то в этом роде. - person svick; 21.08.2012
comment
Да, извините, я был в отпуске... спасибо, Свик, за этот ответ. - person Matt; 08.09.2012
comment
Спасибо за совет по отключению IDisposable. - person Jacques Bosch; 05.08.2013
comment
В зависимости от того, почему вы разрываете ссылки, вы можете рассмотреть DataflowLinkOptions.MaxMessages, которые автоматически разорвут ссылку, когда будет достигнуто целевое количество сообщений. - person VoteCoffee; 04.02.2014