[英]Does BoundedCapacity include items currently being processed in TPL Dataflow?
BoundedCapacity
限制是否僅包括等待處理的輸入隊列中的項目,還是還計算當前正在處理的項目?
讓我們舉個例如這個ActionBlock
:
var block = new ActionBlock<int>(
i => Console.WriteLine(i),
new ExecutionDataflowBlockOptions
{
BoundedCapacity = 1000,
MaxDegreeOfParallelism = 10,
});
如果當前有5個項目並行處理。 這是否意味着輸入隊列可以在這些項目之上容納1000個項目,或僅僅995個?
顯然, BoundedCapacity
確實包括在輸入隊列中等待的項目之上處理的項目。 這可以通過ActionBlock
輕松演示,該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
這是因為添加了1000個項目,其中10個( MaxDegreeOfParallelism
)正在同時處理,其他990正在輸入隊列中等待,而第100個項目永遠不會進入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.