1

さまざまな種類のアウトプロセス メッセージを受信するアルゴリズムを実行しています。着信メッセージは実際にはバイト配列であり、各バイト配列はメッセージ タイプを示すバイト配列フ​​ラグによって事前に保留されます。IPropagator<byte[], byte[]>入ってくるバイト配列を処理し、バイト配列フ​​ラグを解釈してから、特定の対応するリンクされた ActionBlock にバイト配列をストリームするをセットアップできるかどうかを知りたいです。

たとえば、2 つの異なるメッセージ タイプがあり、2 つの異なる対応する ActionBlocks があり、受信するはずのメッセージ タイプと一致するメッセージのみを受信するとします。IPropagatorBlock を両方の Actionblock にリンクすると、両方の ActionBlock が同じメッセージを受け取ると思いますか? フラグに応じて各メッセージを正しく割り当てるにはどうすればよいですか? データフロー構造を正しく設定するのに苦労しています。Post() を使用するのではなく、データ ブロックを相互に直接リンクできるようにしたいと考えています。それは可能ですか?

その点での助けは大歓迎です。

4

1 に答える 1

1

これは、IPropagatorBlock使用している によって異なります。カスタムの場合は、たとえば、リンクされている順序 (またはより信頼できるもの) に基づいて使用するターゲット ブロックを認識するなど、何でもできます。

しかし、ブロックが実際には法線 (またはそのようなもの) であると仮定すると、 predicate を受け取るのオーバーロードを使用し、フラグを出力タイプに追加する (ブロックのタイプを に変更することを意味するTransformBlock) のが最適なオプションだと思います。またはの代わりにカスタムタイプ)。これを行うと、ターゲットの述語がメッセージと一致する場合にのみ、ターゲットがメッセージを受信することを確認できます。LinkTo()IPropagatorBlock<byte[], Tuple<FlagType, byte[]>>Tuple

また、1 つのソース ブロックを複数のターゲット ブロックにリンクするとどうなるかは、ソース ブロックによって異なります。ほとんどの場合、各メッセージを正確に 1 つのターゲットに送信します。最初に最初のターゲットを試行し、最初のターゲットがメッセージを拒否または延期した場合にのみ 2 番目のターゲットを試行します。このルールの例外はBroadcastBlock(および類似のWriteOnceBlock) で、常に各メッセージをすべてのターゲットに送信しようとします。ここでも、カスタム ブロックは任意の方法で動作できます。

于 2012-07-20T11:09:25.570 に答える