4

我使用BroadcastBlock其中TPL Dataflow链接到ActionBlocks. 但是,我在我的代码中找不到错误。我将项目发布到BroadcastBlockvia SendAsync,当我在其中打印项目时,ActionBlocks我发现有些项目丢失了,而神秘的是其他项目是重复的。我跟踪处理项目的顺序,因此发现只是在一个项目丢失之前或后续项目的情况下被复制(通过 馈送到相同的项目ActionblockLinkTo。我不知道发生了什么。以下是我的一些相关代码片段:

这里的实例化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我观察到不常见的错误。我注意到当物品被BroadCastBlock快速送入(通过EventHandlerAPI)时,会发生丢失/重复的物品

知道我做错了什么吗?

4

1 回答 1

1

当我发现问题时,我回答了我自己的问题:

在将项目发送到 之前BroadCastBlock,从并发集合中读取项目(ref 类型),更新,然后发送。因此,有时下一个项目已经从集合中读取并更新,而前一个项目仍然指向同一个对象,该对象现在正在更新过程中。简而言之,这导致了BroadCastBlock. 克隆后没有问题,BroadCastBlock但在输入队列中的项目之前。

SendAsync在通过 Post 或广播块发送 Quote 对象之前,我必须对其执行深层复制。

于 2012-11-02T08:12:47.523 回答