gpt4 book ai didi

c# - BroadcastBlock 未按预期工作

转载 作者:行者123 更新时间:2023-11-30 12:48:56 25 4
gpt4 key购买 nike

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

这里是 BroadCastBlock 的实例化:

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

这是我链接到操作 block 的方式:

//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 时(通过 API 的 EventHandler)

会出现丢失/重复的项目

知道我做错了什么吗?

最佳答案

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

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

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

关于c# - BroadcastBlock 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13175860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com