4

にリンクするを使用しBroadcastBlockます。ただし、コードにバグが見つかりません。アイテムをビアに投稿し、アイテムを印刷すると、一部が欠落しており、不思議なことに重複していることがわかります。処理されたアイテムの順序を追跡しているため、アイテムが欠落しているときに、前のアイテムまたは後続のアイテムが重複していることがわかりました(経由で同じアイテムに供給されます)。何が起こっているのかわかりません。関連する私のコードスニペットのいくつかを次に示します。TPL DataflowActionBlocksBroadcastBlockSendAsyncActionBlocksActionblockLinkTo

ここでのインスタンス化BroadCastBlock:

buffer = new BroadcastBlock<Quote>(quote => quote);

アクションブロックにリンクする方法は次のとおりです。

//Filter for incoming quotes
Predicate<Quote> quoteBroadCastFilter = new Predicate<Quote>(newQuote =>
{
    if (symbol.symbolID == newQuote.symbol.symbolID)
    {
        return true;
    }
    else
    {
        return false;
    }
});

//Link Strategy up to BroadCastBlocks
buffer.LinkTo<Quote>(newStrategy.GetStrategyQuoteBuffer(), new DataflowLinkOptions { PropagateCompletion = true }, quoteBroadCastFilter);

これは私がアイテム(見積もり)をに提出する方法ですBroadCastBlock

buffer.SendAsync(quote);

問題は、すべてを介して送信する直前に追跡情報を印刷すると、SendAsync完全に正常に見えることです。ActionBlockそのリンクに同じ情報を印刷すると、BroadCastBlockまれにエラーが発生します。アイテムが ( APIBroadCastBlockを介して) 非常に迅速にフィードされると、アイテムの欠落/重複が発生することに気付きました。EventHandler

私が間違っていることは何ですか?

4

1 に答える 1

1

問題を見つけたので、私は自分の質問に答えました:

アイテムが に送信される前に、BroadCastBlock(ref 型の) アイテムが並行コレクションから読み取られ、更新されてから送信されます。そのため、前のアイテムが現在更新中の同じオブジェクトを指しているにもかかわらず、次のアイテムがコレクションから既に読み取られて更新されている場合がありました。これは要するに、すでに にあったアイテムに問題を引き起こしましたBroadCastBlockBroadCastBlockクローン後は問題ありませんでしたが、以前は入力キューにアイテムがありました。

SendAsyncPost 経由またはブロードキャスト ブロックに送信する前に、Quote オブジェクトのディープ コピーを実行する必要がありました。

于 2012-11-02T08:12:47.523 に答える