我在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块将结果合并在一起会让我陷入非常混乱的代码。
我在互联网上阅读的每个样本都使用简单类型int
,string
...我没有发现任何涉及更复杂类型的内容。
我觉得使用单个大对象的冲动并通过所有块传递它的引用。在做这个错误之前,我想知道是否有更好的方法。
答案 0 :(得分:0)
经过一段时间与TPL-Dataflow进行思考后,事实证明:
将数据流设想为将生产项目运送到不同工作站的传送带,其中项目被丰富和构建完全错误:这样做会导致难以忍受的硬并发问题。 Dataflow是一个消息传递系统。
相反,我觉得更好地将其描绘为网络人,他们处理外部设施来制作东西(IO,数据库持久性,CalculationEngines .. 。)
使用Tuples可以轻松规避我处理的邮件类型问题。总的来说,我不喜欢Tuples的丑陋,但在这种情况下,我觉得他们真的很适合这个地方。
我的问题是多图片分析。我宁愿使用一个单独的“WorkItemSupplier”类,而不是让Blocks互相传递一个“Workitem”对象而又搞乱它。该类使用WorkItems的ConcurrentDictionary并公开处理工作项的方法。
这样,我在Dataflow中的块只传递工作项的ID,因此他们可以使用WorkItemSupplier作为外部工具来存储/检索,或者更改任何工作项的状态。
通过这种方式,代码运行更平滑,分离更好,更易于阅读。