簡體   English   中英

BoundedCapacity是否包含當前正在TPL數據流中處理的項目?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM