【问题标题】:How do I link multiple target blocks with a source block in TPL Dataflow?如何在 TPL 数据流中将多个目标块与源块链接?
【发布时间】:2014-04-25 10:51:03
【问题描述】:

我预计以下内容会从两个发布者产生输出,但它只产生第一个发布者的输出:

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();

我显然在这里遗漏了一些基本的东西,有什么想法吗?

【问题讨论】:

    标签: c# .net task-parallel-library tpl-dataflow


    【解决方案1】:

    您将 2 个ActionBlocks 链接到一个TransformBlock。您应该将 2 个 ActionBlocks 链接到 BrodcastBlock 并将 BroadcastBlock 链接到 TransformBlock

    你有什么:

    BroadCast => Transfrom => ActionBlock
                           => ActionBlock
    

    你需要什么:

    Transfrom => BroadCast => ActionBlock
                           => ActionBlock
    

    【讨论】:

    • 感谢您的回复。那么是不是一个Transform块不能直接链接到多个目标,而我们必须使用Broadcast块作为中介的问题呢?我可能错过了它,但没有看到暗示这一点的文档。当我在两者之间引入广播块时,它确实有效
    • @AmitG 一些块可以链接到多个目标,但它们不会将项目“复制”到所有目标。对于每个项目,他们只发布到一个目标。 BroadcastBlock 将项目提供给所有目标,直到其项目发生变化。
    • 据我了解,BroadcastBlock 仅向所有目标块提供 latest 值。这意味着如果此示例中的 TransformBlock 具有新值,则 ActionBlocks 可能不会接收所有值 - 特别是如果它们的消耗时间比 TransformBlock 产生的时间长。
    • @urbanhusky 它只提供要接收的最新消息,但它会传递到每个可以接受消息的链接目标块。 See documentation。在最底部:“BroadcastBlock&lt;T&gt; 确保在允许覆盖元素之前将当前元素广播到任何链接的目标。”
    • @MarcL。它仍然不能保证传送到 所有 目标。如果您只需要一个目标来处理消息,那没关系 - 但如果您需要传递到所有目标,例如多路复用器块,那么您必须编写自己的块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2018-05-06
    • 2013-12-18
    • 2021-11-10
    相关资源
    最近更新 更多