BoundedCapacity
限制是否仅包括等待处理的输入队列中的项目,还是还计算当前正在处理的项目?
让我们以ActionBlock
:
var block = new ActionBlock<int>(
i => Console.WriteLine(i),
new ExecutionDataflowBlockOptions
{
BoundedCapacity = 1000,
MaxDegreeOfParallelism = 10,
});
如果当前有5个项目并行处理。这是否意味着输入队列可以容纳1000个项目位于之上,或仅仅995?
答案 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 项目中永远不会进去。