【问题标题】:Messages types with DataFlow Blocks带有数据流块的消息类型
【发布时间】:2016-01-21 16:12:29
【问题描述】:

我在 TPL-Dataflow 上进行自我训练,并且我已经阅读到使用不可变对象作为消息是要走的路。

为了遵守这一点,我为每个块的输入和输出设计了特定的类。

不幸的是,当我将我的块相互链接时,因为块的输入和输出类型非常不同,导致TransformBlock的泛滥:

var proc1 = new TransformBlock<proc1In,proc1Out>(...
var convertOut1toIn2 = new TransformBlock<proc1Out,proc2In>(p1 => new proc2In { ... 
var proc2 = TransformBlock<proc2In,proc2Out>(...

proc1.LinkTo(convertOut1ToIn2);
convertOut1ToIn2.LinkTo(proc2);

稍后使用 Batch 和 Join 块将结果合并在一起让我难以处理非常混乱的代码。

我在 Internet 上阅读的每个示例都使用简单类型,例如 intstring...我没有找到任何处理更复杂类型的东西。

我有使用单个大对象并将其引用传递给所有块的冲动。在犯这个错误之前,我想知道是否有更好的方法。

【问题讨论】:

    标签: c# tpl-dataflow


    【解决方案1】:

    经过一段时间的思考TPL-Dataflow,结果是:

    • 将 Dataflow 设想为传送带,将制造物品运送到不同的工作站进行丰富和构建是完全错误的:这样做会导致难以忍受的硬并发问题。 Dataflow 是一个消息传递系统。

    • 相反,我觉得将它描绘成一个人的网格更好,他们处理外部设施来制造事物(IO、数据库持久性、CalculationEngines.. .)

    使用Tuples 可以轻松绕过我处理的消息类型问题。总的来说,我不喜欢 Tuples 的丑陋,但在这种情况下,我觉得它们真的很适合这个地方。

    我的问题是多图分析。与其让块相互传递“Workitem”对象并弄乱它,我宁愿使用单独的“WorkItemSupplier”类。此类使用 WorkItems 的 ConcurrentDictionary 并公开处理工作项的方法。

    这样,我在 Dataflow 中的块只相互传递工作项的 ID,因此它们可以使用 WorkItemSupplier 作为外部工具来存储/检索或更改任何工作项的状态。

    通过这种方式,代码运行起来更加流畅、分离良好且更易于阅读。

    【讨论】:

    • 另外,this question 对从多个结果中过滤/合并块有很大帮助。
    猜你喜欢
    • 2013-11-02
    • 2017-10-07
    • 1970-01-01
    • 2010-10-25
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多