TPL データフロー、リンクされた多数のターゲット ブロックのうち、特定の 1 つのターゲット ブロックにのみアイテムを転送するにはどうすればよいでしょうか? 質問する

TPL データフロー、リンクされた多数のターゲット ブロックのうち、特定の 1 つのターゲット ブロックにのみアイテムを転送するにはどうすればよいでしょうか? 質問する

私は、複数のアイテムを保持でき、複数のターゲット ブロックにリンクできるが、フィルター/述語を通過する特定のターゲット ブロックにのみアイテムを転送できる TPL データ フロー ブロック ソリューションを探しています。アイテムは、複数のターゲット ブロックに同時に配信されるべきではなく、常にフィルターに一致する 1 つのターゲット ブロックにのみ配信されるか、アイテムが破棄される可能性があります。BroadCastBlock は好きではありません。私の理解が正しければ、配信が保証されず (保証されるのでしょうか?)、フィルタリングはターゲット ブロック側で行われるため、BroadCastBlock は基本的に各アイテムのコピーをすべての linkedTo ターゲット ブロックに送信するからです。また、私の理解が正しければ、一度に複数のアイテムを保持することはできません。Post/Async は使用せず、LinkTo チェーンを維持します。

完全なカスタム データ フロー ブロックを回避する方法はありますか? それとも、BroadCastBlock の動作を誤解していますか? 残念ながら、詳細に説明し、ユース ケースを網羅したドキュメントはあまりありません。 どのようなアイデアでも大歓迎です。

ベストアンサー1

BufferBlock私の理解が正しければ、あなたが望むことは、述語を持つすべてのターゲットブロックにリンクされる単純な で実現できます。また、(無条件に) にリンクすることもできます。NullTargetブロック、一致しなかった項目を破棄します。

何かのようなもの:

var forwarder = new BufferBlock<SomeType>();
forwarder.LinkTo(target1, item => matchesTarget1(item));
forwarder.LinkTo(target2, item => matchesTarget2(item));
forwarder.LinkTo(DataflowBlock.NullTarget<SomeType>());

この方法では、一致する最初のターゲットがあれば、各アイテムがそこに送信されます。

BroadcastBlock各アイテムを複数のターゲットに送信する場合や、ターゲット ブロックの速度が十分でない場合にアイテムを破棄する場合に役立ちます。

ではBroadcastBlock、どのブロックも受け入れない場合、アイテムはドロップされる可能性があります (後で受け入れ可能になる場合でも)。ただし、アイテムはランダムにドロップされるわけではないので、対象のブロックに が設定BoundedCapacityされていない場合は、拒否していないすべてのアイテムが確実に取得されると思います (たとえば、 で述語を使用するなどLinkTo())。

おすすめ記事