gpt4 book ai didi

c# - tpl 数据流 : fixed buffer size without throwing items away

转载 作者:太空狗 更新时间:2023-10-29 17:52:01 24 4
gpt4 key购买 nike

在尝试了数据流之后,我遇到了一个新问题。我想限制所有 block 的输入队列。我的 producingblock (ActionBlock) 正在快速创建 5000 个元素并将它们发布到 broadcastblock。因此,如果我将 broadcastblock 的 BoundedCapacity 设置为 100,他会丢弃大量数据。但我更希望 producingblock 在我的 bufferblock 的输入队列中等待新的插槽。

有什么办法可以解决这个问题吗?

最佳答案

这正是 BufferBlock 的用途。如果您设置了它的 BoundedCapacity 并且它变满了,它将推迟接收任何消息,直到有人使用它们。这意味着,例如 Post() 将阻塞,而 SendAsync() 将返回一个未完成的 Task

编辑:没有内置 block 可以发送到多个目标并且从不丢弃数据。但是您可以轻松地从 ActionBlock 和发送循环中自己构建一个:

static ITargetBlock<T> CreateMultipleTargetsBlock<T>(
IEnumerable<ITargetBlock<T>> targets, int boundedCapacity)
{
var targetsList = targets.ToList();

var block = new ActionBlock<T>(
async item =>
{
foreach (var target in targetsList)
{
await target.SendAsync(item);
}
},
new ExecutionDataflowBlockOptions { BoundedCapacity = boundedCapacity });

// TODO: propagate completion from block to targets

return block;
}

此代码假定您不需要为每个目标克隆数据并且目标列表永远不会更改。为此修改代码应该相当简单。

关于c# - tpl 数据流 : fixed buffer size without throwing items away,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18846668/

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