C# 最优化的第三方物流数据流设计?
我喜欢询问如何使用TPL数据流最佳地设计最优化的体系结构。我还没有编写代码,所以没有可以发布的示例代码。我也不是在寻找代码(除非自愿),但在设计方面的帮助将不胜感激: 要求如下: 我有3个核心数据块,它们以特定的方式相互依赖。Datablock1是生成Foo1类型对象的生产者。Datablock2应该订阅Foo1对象(来自Datablock1),并可能(不是在每个Foo1上,根据特定的函数)生成Foo2对象,该对象存储在输出队列中,供其他DataBlock使用。Datablock3还使用Foo1对象(来自Datablock1),并可能生成Datablock2使用并转换为Foo2对象的Foo3对象 总之,以下是数据块及其各自产生和消耗的内容:C# 最优化的第三方物流数据流设计?,c#,architecture,asynchronous,concurrency,tpl-dataflow,C#,Architecture,Asynchronous,Concurrency,Tpl Dataflow,我喜欢询问如何使用TPL数据流最佳地设计最优化的体系结构。我还没有编写代码,所以没有可以发布的示例代码。我也不是在寻找代码(除非自愿),但在设计方面的帮助将不胜感激: 要求如下: 我有3个核心数据块,它们以特定的方式相互依赖。Datablock1是生成Foo1类型对象的生产者。Datablock2应该订阅Foo1对象(来自Datablock1),并可能(不是在每个Foo1上,根据特定的函数)生成Foo2对象,该对象存储在输出队列中,供其他DataBlock使用。Datablock3还使用Foo1
- 数据块1:产生(Foo1),消耗(无)
- 数据块2:生产(Foo2),消费(Foo1,Foo3)
- 数据块3:生产(Foo3),消费(Foo1)
非常感谢任何想法或建议。让我们把这个问题分成三部分,分别解决 第一个问题是如何有条件地生成项目。我认为最好的选择是使用并让函数返回一个包含一个或零个项的集合 另一个选项是,当您不想生成任何内容时,忽略
null
s并返回null
。
但如果这样做,还必须将源链接到,以便null
s不会停留在其输出缓冲区中
第二个问题是如何将foo1同时发送到block#2和block#3。我在这里可以看到两种方式:
BroadcastBlock
。注意这一点,因为BroadcastBlock
没有输出队列,所以如果目标块延迟了一个项目,这意味着它不会处理它。因此,在这种情况下,不应设置块2和块3的BoundedCapacity
。如果不这样做,它们将永远不会延迟,所有消息都将由两个块处理TransformBlock
和一个TransformBlock
。然后,您可以将它们链接到一个缓冲块
BatchedJoinBlock
,将batchSize
设置为1。这意味着生成的元组将始终包含一个Foo1
或一个Foo3
BatchedJoinBlock
链接到生成更合适类型的TransformBlock
来增强先前的解决方案。这可以是Tuple
(其中一个项将始终为null
),也可以是类似于F#的东西,它确保只设置两个项中的一个isoourceblock
,并且还具有两个属性:ITarget
类型的Target1
和ITarget
类型的Target2
,与内置连接块类似使用选项#1和#3,您还可以将块封装到单个自定义块中,从外部看,该块类似于#4中的块,因此更易于重用。让我们将此问题分成三部分,并分别解决 第一个问题是如何有条件地生成项目。我认为最好的选择是使用并让函数返回一个包含一个或零个项的集合 另一个选项是,当您不想生成任何内容时,忽略
null
s并返回null
。
但如果这样做,还必须将源链接到,以便null
s不会停留在其输出缓冲区中
第二个问题是如何将foo1同时发送到block#2和block#3。我在这里可以看到两种方式:
BroadcastBlock
。注意这一点,因为BroadcastBlock
没有输出队列,所以如果目标块延迟了一个项目,这意味着它不会处理它。因此,在这种情况下,不应设置块2和块3的BoundedCapacity
。如果你不想