【发布时间】:2012-06-28 09:55:24
【问题描述】:
我想请教如何使用 TPL 数据流设计最佳架构。我还没有编写代码,所以没有可以发布的示例代码。我也不是在寻找代码(除非自愿),但非常感谢设计方面的帮助:
要求如下:
我有 3 个以特定方式相互依赖的核心数据块。 Datablock1 是生产 Foo1 类型对象的生产者。 Datablock2 应该订阅 Foo1 对象(来自 Datablock1),并且可能(不是在每个 Foo1 上,受特定函数约束)生成 Foo2 对象,并将其存储在输出队列中以供其他数据块使用。 Datablock3 还使用 Foo1 对象(来自 Datablock1)并可能生成 Foo3 对象,Datablock2 使用这些对象并转换为 Foo2 对象。
总之,以下是数据块以及它们各自产生和消耗的内容:
- Datablock1:生产(Foo1),消费(无)
- Datablock2:生产(Foo2),消费(Foo1,Foo3)
- Datablock3:生产(Foo3),消费(Foo1)
另一个要求是在 Datablock2 和 Datablock3 中几乎同时处理相同的 Foo1。如果 Foo1 对象首先由 Datablock2 使用,然后一旦 Datablock2 完成其工作,同样的 Foo1 对象将被发布到 Datablock3 以供其工作。 Datablock2 中的 Foo2 对象可以来自对 Foo1 对象或 Foo3 对象的操作。
我希望这是有道理的,如果仍然不清楚,我很乐意解释更多。
我的第一个想法是为 3 个数据块中的每一个创建 TPL 数据流块,并让它们处理不同对象类型的传入流。另一个想法是拆分数据块,让每个数据块只处理一种对象类型的流。您有什么建议,或者是否有更好的解决方案可能有效?
Svick 已经在 Datablock1 上提供了帮助,并且它已经投入使用,我只是纠结于如何将我当前的环境(如上所述)转换为 TPL 数据流。
非常感谢任何想法或建议。
【问题讨论】:
-
如果您正在寻找最高效的架构,只有一个可以正确找到:测量不同的选项以找出哪个实际上是最好的。其他一切都只是猜测。
-
完全同意,但在这一点上,我不确定数据块是否可以设置为接受来自与其链接的不同 ISourceBlocks 的对象。如果我知道如何编写一个可以采用例如 Foo1 和 Foo2 对象的数据块,将它们缓冲在 2 个单独的输入队列中并让传入的函数在其中一个上运行,那么我将能够自己设置一些测试架构。问题是 TPL 数据流文档目前几乎不存在。您能否帮助解决如何接受多个生产者将不同的对象传递给一个数据流块?
-
Foo1和Foo3是否共享一个公共基类?如果不是,为什么块 2 可以同时处理? -
他们不共享任何基类。关键是要弄清楚是否可以设计一个块来获取/处理两个不同的流(不同类型的对象)。这就是这个练习的重点,要弄清楚什么是可行的,什么是不可行的,因为 TPL 数据流文档没有太多可说的,至少我没有找到太多。我偶然发现了 BatchedJoinBlock 但不确定它是否适用于这里......
-
@svick,我的问题是数据流块是否可以设计为接受来自 2 个单独数据块的不同类型的流。我认为 TPL Dataflow 应该提供一种或另一种方式听起来像是一个合理的要求,但它只是文档太稀少了,以至于到目前为止我还没有看到任何提到可以自己处理多种数据类型的任何类型的块的任何内容相应的输入队列。
标签: c# architecture asynchronous concurrency tpl-dataflow