如何在TPL数据流中将多个目标块与源块链接?

Ami*_*t G 13 .net c# task-parallel-library tpl-dataflow

我期望以下两个发布者产生输出,但它只产生第一个的输出:

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();
Run Code Online (Sandbox Code Playgroud)

我显然在这里缺少一些基本的东西,任何想法?

i3a*_*non 15

您将2 ActionBlocks 链接到单个TransformBlock.您应该将2 ActionBlocks BrodcastBlock链接BroadcastBlock到并链接到TransformBlock.

你有什么:

BroadCast => Transfrom => ActionBlock
                       => ActionBlock
Run Code Online (Sandbox Code Playgroud)

你需要什么:

Transfrom => BroadCast => ActionBlock
                       => ActionBlock
Run Code Online (Sandbox Code Playgroud)

  • @AmitG某些块可以链接到多个目标,但它们不会将项目"复制"到所有目标.对于每个项目,他们只发布到一个目标.BroadcastBlock将项目提供给所有目标,直到其项目更改为止. (4认同)
  • 据我所知,"BroadcastBlock"仅向所有目标块提供**最新**值.这意味着如果此示例中的`TransformBlock`具有新值,则`ActionBlocks`可能不会接收所有值 - 特别是如果它们比`TransformBlock`产生的消耗时间更长. (3认同)