Как связать несколько целевых блоков с исходным блоком в потоке данных TPL?

Я ожидал, что следующее выйдет из обоих издателей, но оно выводит только первый результат:

var broadcastBlock = new BroadcastBlock<int>(null);
var transformBlock = new TransformBlock<int, int>(i => i*10);
var publish1 = new ActionBlock<int>(i => Console.WriteLine("Publisher 1:" + i));
var publish2 = new ActionBlock<int>(i => Console.WriteLine("Publisher 2:" + i));

broadcastBlock.LinkTo(transformBlock, new DataflowLinkOptions() { PropagateCompletion = true });
transformBlock.LinkTo(publish1, new DataflowLinkOptions() { PropagateCompletion = true });
transformBlock.LinkTo(publish2, new DataflowLinkOptions() { PropagateCompletion = true });

foreach (var i in Enumerable.Range(0, 5))
{
    broadcastBlock.Post(i);
}
broadcastBlock.Complete();
Task.WhenAll(publish1.Completion, publish2.Completion).Wait();

Мне явно не хватает чего-то фундаментального здесь, каких-либо идей?

Ответ 1

Вы связываете 2 ActionBlock с одним TransformBlock. Вы должны привязать 2 ActionBlock к BrodcastBlock и связать BroadcastBlock с TransformBlock.

Что у вас есть:

BroadCast => Transfrom => ActionBlock
                       => ActionBlock

Что вам нужно:

Transfrom => BroadCast => ActionBlock
                       => ActionBlock