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

i3a*_*non 7 .net c# task-parallel-library tpl-dataflow

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

让我们举个例子ActionBlock:

var block = new ActionBlock<int>(
    i => Console.WriteLine(i),
    new ExecutionDataflowBlockOptions
    {
        BoundedCapacity = 1000,
        MaxDegreeOfParallelism = 10,
    });
Run Code Online (Sandbox Code Playgroud)

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

i3a*_*non 9

显然,BoundedCapacity确实包括在输入队列中等待的项目之上处理的项目.这可以通过与永不完成ActionBlock相同的方式轻松演示:ExecutionDataflowBlockOptionsaction

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);
}
Run Code Online (Sandbox Code Playgroud)

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

...
...
#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
Run Code Online (Sandbox Code Playgroud)

那是因为添加了1000个项目,其中10个(MaxDegreeOfParallelism)正在同时处理,其他990正在输入队列中等待,而第100个项目永远不会进入.

  • 所以BoundedCapacity也是最大DOP的上限. (2认同)