具有数据流块的消息类型

本文关键字:消息 类型 数据流 | 更新日期: 2023-09-27 18:31:17

我正在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...我没有找到任何处理更复杂的类型的东西。

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

具有数据流块的消息类型

在对TPL-Dataflow进行了一段时间的思考后,结果发现:

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

  • 相反,我觉得最好把它想象成一个处理外部设施来制造东西的人的网格(IO、数据库持久性、计算引擎......

我处理的消息类型的问题很容易使用元组来规避。总的来说,我不喜欢Tuples的丑陋,但在这种情况下,我觉得它们真的很适合这个地方。

我的问题是多重图片分析。与其让 Blocks 相互传递"工作项"对象并弄乱它,我宁愿使用单独的"WorkItemSupplier"类。此类使用工作项的并发字典,并公开处理工作项的方法。

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

通过这种方式,代码运行得更流畅、分离得更远、更易于阅读。