Удаляются ли элементы из 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 для всего трубопровода.