tpl dataflow:固定缓冲区大小而不丢弃项目

在使用数据流后,我遇到了一个新问题。 我想限制所有块的输入队列。 我的产品块(ActionBlock)正在快速创建5000个元素并将它们发布到广播块。 因此,如果我将广播块的BoundedCapacity设置为100,则会抛出大量数据。 但我更希望生产块等待我的缓冲区输入队列中的新槽。

有没有办法摆脱这个问题?

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

编辑:没有内置块发送到多个目标,永远不会丢弃数据。 但是你可以从ActionBlock轻松地构建一个并发送循环:

 static ITargetBlock CreateMultipleTargetsBlock( IEnumerable> targets, int boundedCapacity) { var targetsList = targets.ToList(); var block = new ActionBlock( async item => { foreach (var target in targetsList) { await target.SendAsync(item); } }, new ExecutionDataflowBlockOptions { BoundedCapacity = boundedCapacity }); // TODO: propagate completion from block to targets return block; } 

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