1

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

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

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

4

1 回答 1

1

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

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

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

于 2012-07-20T11:09:25.570 回答