Поток данных TPL и BatchJoinBlock с разными размерами пакетов

Допустим, у меня есть данные, поступающие из двух разных источников на двух разных частотах, и я должен объединить их и обработать вместе. Частота на канале A составляет 100 Гц (100 целых чисел в секунду), а частота на канале B - 1 Гц (1 целое число в секунду). Данные уже обрабатываются на каждом отдельном канале с помощью ActionBlock из потока данных TPL. Однако теперь мне нужно обработать его вместе (1000 int из A и 5 int из B за раз). Для меня решением было бы объединить эти блоки с помощью BatchJoinBlock, который будет ждать 1000 сообщений из канала A (1000 целых чисел) и 5 ​​сообщений из канала B (5 целых чисел). После того, как пакеты заполнены, активируйте их в блоке действий и обработайте.

Проблема - согласно документации, BatchJoinBlock (MSDN) всегда будет иметь все пакеты одинакового размера.

Как я мог выбрать разные размеры?

В качестве альтернативы я, вероятно, мог бы создать 2 разных объекта BatchBlock с разными размерами, а затем запустить их в JoinBlock, который, в свою очередь, отправил бы данные в ActionBlock; но это кажется излишним, или это обычный подход?

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


person Daniel Gruszczyk    schedule 17.01.2014    source источник
comment
Я думаю, что ваши две разные идеи BatchBlock - лучший вариант. Мне нечего к этому добавить.   -  person i3arnon    schedule 17.01.2014


Ответы (1)


Вы в значительной степени разобрались во всем сами. BatchJoinBlock предназначен для случаев, когда у вас есть два типа и вы хотите партии определенного размера, считая элементы обоих типов до одного и того же размера.

Например, если один тип был успешным, а второй - неудачным. Если вы хотите создать пакеты из n результатов, независимо от того, сколько из них успешных, а сколько неудачных, вы должны использовать BatchJoinBlock.

Я считаю, что причина, по которой нет ни одного блока, который бы выполнял именно то, о чем вы просите, заключается в том, что вы можете создать ту же функциональность из двух BatchBlock и JoinBlock. Сила Dataflow заключается в объединении различных блоков, поэтому я думаю, что это именно то, что вам следует делать. (Вы не можете построить BatchJoinBlock из других существующих блоков.)

person svick    schedule 17.01.2014
comment
Спасибо, подтверждение правильного подхода обнадеживает. И вы красиво объяснили причины. - person Daniel Gruszczyk; 17.01.2014