带有DataFlow块的消息类型

时间:2016-01-21 16:12:29

标签: c# tpl-dataflow

我在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块将结果合并在一起会让我陷入非常混乱的代码。

我在互联网上阅读的每个样本都使用简单类型intstring ...我没有发现任何涉及更复杂类型的内容。

我觉得使用单个大对象的冲动并通过所有块传递它的引用。在做这个错误之前,我想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:0)

经过一段时间与TPL-Dataflow进行思考后,事实证明:

  • 将数据流设想为将生产项目运送到不同工作站的传送带,其中项目被丰富和构建完全错误:这样做会导致难以忍受的硬并发问题。 Dataflow是一个消息传递系统。

  • 相反,我觉得更好地将其描绘为网络人,他们处理外部设施来制作东西(IO,数据库持久性,CalculationEngines .. 。)

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

我的问题是多图片分析。我宁愿使用一个单独的“WorkItemSupplier”类,而不是让Blocks互相传递一个“Workitem”对象而又搞乱它。该类使用WorkItems的ConcurrentDictionary并公开处理工作项的方法。

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

通过这种方式,代码运行更平滑,分离更好,更易于阅读。