我原以为以下代码可以从两个发布者(publishers)那里都输出结果,但实际上只从第一个发布者那里输出结果:
我期望以下代码可以从两个发布者那里都得到输出,但它仅从第一个发布者那里输出结果:
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();
我显然在这里缺少一些基本的东西,有什么想法吗?
BroadcastBlock
只向所有目标块提供 最新的 值。这意味着如果此示例中的TransformBlock
有新值,ActionBlocks
可能不会接收到所有的值,尤其是如果它们消耗的时间比TransformBlock
生产的时间长的话。 - urbanhuskyBroadcastBlock<T>
确保当前元素在允许覆盖元素之前广播到任何链接的目标。" - Marc L.ActionBlocks
链接到一个TransformBlock
。你应该将这两个ActionBlock
链接到BrodcastBlock
,然后将BroadcastBlock
链接到TransformBlock
。LinkTo
方法是从source
指向target
,而不是相反。因此,我认为答案的措辞有些令人困惑。不过图示是正确的。 - Theodor Zoulias