TPL Dataflow消息类型分配模式可能吗?

时间:2012-07-20 09:34:13

标签: c# task-parallel-library messaging tpl-dataflow

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

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

非常感谢任何有关这方面的帮助。

1 个答案:

答案 0 :(得分:1)

这取决于您使用的IPropagatorBlock。如果它是自定义的,你可以做任何事情,包括例如根据它们链接的顺序(或更可靠的东西)识别要使用的目标块。

但假设该块实际上是一个正常的TransformBlock(或类似的东西),我认为最好的选择是使用the overload of LinkTo() that takes a predicate,并将标志添加到输出类型(这意味着更改块的类型为IPropagatorBlock<byte[], Tuple<FlagType, byte[]>>,或自定义类型而不是Tuple)。如果这样做,那么只有当该目标的谓词与消息匹配时,您才能确定目标是否会收到消息。

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