Включает ли BoundedCapacity элементы, которые в настоящее время обрабатываются в потоке данных TPL?

Включает ли лимит BoundedCapacity только элементы во входной очереди, ожидающие обработки, или он также учитывает элементы, обрабатываемые в данный момент?

Возьмем, к примеру, это ActionBlock:

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

Если в настоящее время параллельно обрабатывается 5 элементов. Означает ли это, что входная очередь может содержать еще 1000 элементов поверх этих или только 995?


person i3arnon    schedule 27.10.2014    source источник


Ответы (1)


Очевидно, что 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

Это связано с тем, что было добавлено 1000 элементов, 10 из них (MaxDegreeOfParallelism) обрабатываются одновременно, остальные 990 ожидают во входной очереди, а 1001st элемент не может попасть туда.

person i3arnon    schedule 27.10.2014
comment
Таким образом, BoundedCapacity также является верхней границей максимального DOP. - person usr; 27.10.2014
comment
@usr Точно. Вот я пришел к этому вопросу. - person i3arnon; 28.10.2014
comment
Спасибо, очень полезно. - person Matt; 18.01.2018