BoundedCapacity是否包含当前正在TPL数据流中处理的项目?

时间:2014-10-27 18:43:47

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

BoundedCapacity限制是否仅包括等待处理的输入队列中的项目,还是还计算当前正在处理的项目?

让我们以ActionBlock

为例
var block = new ActionBlock<int>(
    i => Console.WriteLine(i),
    new ExecutionDataflowBlockOptions
    {
        BoundedCapacity = 1000,
        MaxDegreeOfParallelism = 10,
    });

如果当前有5个项目并行处理。这是否意味着输入队列可以容纳1000个项目位于之上,或仅仅995?

1 个答案:

答案 0 :(得分:9)

显然,BoundedCapacity确实包括在输入队列中等待的项目之上处理的项目。这可以通过ActionBlock轻松证明,ExecutionDataflowBlockOptions具有相同的action var block = new ActionBlock<int>( _ => Task.Delay(-1), new ExecutionDataflowBlockOptions { BoundedCapacity = 1000, MaxDegreeOfParallelism = 10, }); for (int i = 0; i < 1001; i++) { Console.WriteLine("#{0} - InputCount={1}", i, block.InputCount); await block.SendAsync(i); } 永远不会完成:

...
...
#990 - InputCount=980
#991 - InputCount=981
#992 - InputCount=982
#993 - InputCount=983
#994 - InputCount=984
#995 - InputCount=985
#996 - InputCount=986
#997 - InputCount=987
#998 - InputCount=988
#999 - InputCount=989
#1000 - InputCount=990

输出如下,然后应用程序将无限期地阻止:

MaxDegreeOfParallelism

这是因为添加了1000个项目,其中10个({{1}})正在同时处理,其他990正在输入队列和1001 st 项目中永远不会进去。