BoundedCapacity是否包括在TPL Dataflow中正在处理的项目?

15

BoundedCapacity 限制只包括等待被处理的输入队列中的项目,还是同时也包括正在处理的项目?

让我们以这个 ActionBlock 为例:

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

如果当前有5个项目在并行处理,那么这是否意味着输入队列可以再额外容纳1000个项目(不包括这5个),还是只能容纳995个?

1个回答

20

显然,BoundedCapacity确实包括正在处理的项目以及等待在输入队列中的项目。这可以通过具有相同ExecutionDataflowBlockOptions和永远不完成的actionActionBlock轻松演示:

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

那是因为添加了1000个项目,其中10个(MaxDegreeOfParallelism)正在并发处理,其他990个在输入队列中等待,第1001个项目永远无法进入。


3
BoundedCapacity也是最大DOP的上限。 - usr
@usr 没错。这个链接 就是我找到这个问题的方式。 - i3arnon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接