C# TPL数据流消息类型分配模式是否可能?

C# TPL数据流消息类型分配模式是否可能?,c#,task-parallel-library,messaging,tpl-dataflow,C#,Task Parallel Library,Messaging,Tpl Dataflow,我运行一个算法,接收不同类型的进程外消息。传入消息实际上是字节数组,每个字节数组都由指示消息类型的字节数组标志预先挂起。我想了解是否可以设置一个IPropagator,它处理传入的字节数组,解释字节数组标志,然后将字节数组流式传输到特定的对应链接动作块 例如,假设我有两种不同的消息类型,我有两种不同的对应ActionBlock,它们应该只接收与它们应该接收的预期消息类型匹配的消息。我相信如果我只是将IPropagatorBlock链接到两个ActionBlock,那么两个ActionBlock将

我运行一个算法,接收不同类型的进程外消息。传入消息实际上是字节数组,每个字节数组都由指示消息类型的字节数组标志预先挂起。我想了解是否可以设置一个
IPropagator
,它处理传入的字节数组,解释字节数组标志,然后将字节数组流式传输到特定的对应链接动作块

例如,假设我有两种不同的消息类型,我有两种不同的对应ActionBlock,它们应该只接收与它们应该接收的预期消息类型匹配的消息。我相信如果我只是将IPropagatorBlock链接到两个ActionBlock,那么两个ActionBlock将收到相同的消息?如何根据每个消息的标志正确分配每个消息(不要担心标志,标识很简单,假设我随时知道ActionBlock IPropgatorBlock要将消息流传输到哪个操作块)?我正在努力正确设置数据流结构。我希望能够将数据块直接链接到彼此,而不必Post()。可能吗


在这方面的任何帮助都是非常感谢的

这取决于您正在使用的
IPropagatorBlock
。如果是自定义块,则可以执行任何操作,例如,根据链接顺序识别要使用的目标块(或更可靠的操作)

但是假设块实际上是一个普通的
TransformBlock
(或者类似的东西),我认为最好的选择是使用,并将标志添加到输出类型(这意味着将块的类型更改为
IPropagatorBlock
,或者使用自定义类型而不是
元组
)。如果这样做,则可以确保只有当目标的谓词与消息匹配时,目标才会收到消息


此外,如果将一个源块链接到多个目标块,会发生什么情况取决于源块。在大多数情况下,它只将每条消息发送给一个目标:它首先尝试第一个目标,只有在第一个目标拒绝或延迟消息时才尝试第二个目标。此规则的例外情况是
BroadcastBlock
(以及类似的
WriteOnceBlock
),它始终尝试将每条消息发送到所有目标。同样,自定义块可以以任何方式运行。

这取决于您正在使用的
IPropagatorBlock
。如果是自定义块,则可以执行任何操作,例如,根据链接顺序识别要使用的目标块(或更可靠的操作)

但是假设块实际上是一个普通的
TransformBlock
(或者类似的东西),我认为最好的选择是使用,并将标志添加到输出类型(这意味着将块的类型更改为
IPropagatorBlock
,或者使用自定义类型而不是
元组
)。如果这样做,则可以确保只有当目标的谓词与消息匹配时,目标才会收到消息


此外,如果将一个源块链接到多个目标块,会发生什么情况取决于源块。在大多数情况下,它只将每条消息发送给一个目标:它首先尝试第一个目标,只有在第一个目标拒绝或延迟消息时才尝试第二个目标。此规则的例外情况是
BroadcastBlock
(以及类似的
WriteOnceBlock
),它始终尝试将每条消息发送到所有目标。同样,自定义块可以以任何方式运行。

我将亲自测试它,但您的直觉是,使用谓词/过滤器的方法与在转换块内手动进行分配,然后根据标志是什么简单地发布到Actionblocks相比有多快。(显然不需要transformblock,而需要一个actionblock发布到其他actionblock。显然不是最漂亮的方式,但你认为它会比使用谓词更快/更慢吗?我认为使用谓词会有很小的性能损失。如果你有很多目标,那么线性搜索正确的目标就可以了这可能是一个问题,但你的情况似乎并非如此。我尝试了它:圆滑的解决方案,速度非常快。非常感谢。我之所以提出这个问题,是因为我有使用ZeroMQ作为消息系统的传入消息。我要么只有一个传入套接字,并将不同的消息类型分配给相应的操作块进行处理,要么设置为每种消息类型创建一个套接字,并且必须编写大量代码来编写事件处理程序并将事件转发到另一个类。我喜欢尝试这种方法,因为我无论如何都要并发处理。我将自己测试它,但是您觉得使用谓词/过滤器的方法与在事务处理中手动分配相比有多快sform块,然后根据标志的内容简单地发布到Actionblocks。(显然不需要transformblock,而需要一个actionblock发布到其他actionblock。显然不是最漂亮的方式,但你认为它会比使用谓词更快/更慢吗?我认为使用谓词会有很小的性能损失。如果你有很多目标,那么线性搜索正确的目标就可以了这可能是一个问题,但你的情况似乎并非如此。我尝试了它:圆滑的解决方案,速度非常快。非常感谢。我之所以提出这个问题,是因为我有使用ZeroMQ作为消息系统的传入消息。我要么只有一个传入套接字,并将不同的消息类型分配给相应的操作块进行处理,要么设置为每种消息类型创建一个套接字,并且必须编写大量代码来编写事件处理程序并将事件转发给另一个类。我喜欢尝试这种方法,因为我无论如何都希望并发处理。