tpl数据流:固定缓冲区大小而不丢弃项目

时间:2013-09-17 09:54:07

标签: c# .net task-parallel-library tpl-dataflow

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

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

1 个答案:

答案 0 :(得分:7)

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

编辑:没有内置块可以发送到多个目标,也不会丢弃数据。但是你可以从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;
}

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