Удаляются ли элементы из BufferBlock при запуске или завершении ActionBlock?

Допустим, у меня есть BufferBlock с ограниченной емкостью 2, и я связываю его (используя LinkTo()) ActionBlock с MaxDegreeOfParallelism = 2. Теперь я знаю, что сразу же смогу отправить 2 элемента в буфер, и ActionBlock начнет немедленно их обрабатывать. Но допустим, что действия занимают несколько секунд. Смогу ли я отправить еще 2 элемента в буфер, пока выполняются действия, выполняемые первыми, или элемент удаляется из буфера только после завершения действия, которое потребляет его?

1 ответ

Решение

Если твой ActionBlock имеет неограниченную емкость ограниченную емкость на вашем BufferBlock не имеет значения, ActionBlock будет буферизовать все ваши элементы, пока у вас не закончится память. Если, однако, вы установили BoundedCapcity на ваше ActionBlock до 2, а также MaxDegreeParallelism до 2 он будет обрабатывать два сообщения и держать 2 сообщения в своем буфере. Тогда ваш буферный блок буферизует 2 дополнительных сообщения. Любые дополнительные сообщения должны будут ждать емкости в вашем конвейере. Лучший способ дождаться освобождения места - использовать await myPipeline.SendAsync(data), Всего у вас будет емкость 6 для всего трубопровода.

Другие вопросы по тегам