当 ActionBlock 开始或结束时,项目是否从 BufferBlock 中移除?

Are items removed from BufferBlock when ActionBlock starts or ends?

假设我有一个 BufferBlock,有界容量为 2,我 link 它(使用 LinkTo())一个 MaxDegreeOfParallelism = 2 的 ActionBlock。现在,我知道我将立即能够将 2 个项目发送到缓冲区,并且 ActionBlock 将立即开始处理它们。但是假设这些操作需要几秒钟才能完成。当第一个执行操作的是 运行 时,我是否能够将另外 2 个项目发送到缓冲区中,或者一个项目仅在消耗它的操作完成后才从缓冲区中删除?

如果你的 ActionBlock 有一个未绑定的容量,你的 BufferBlock 上的有界容量将无关紧要,ActionBlock 将缓冲你的所有项目,直到你 运行内存不足。但是,如果您将 ActionBlock 上的 BoundedCapcity 设置为 2,将 MaxDegreeParallelism 设置为 2,它将处理两条消息并在其缓冲区中保存两条消息。然后你的缓冲块将缓冲 2 个额外的消息。任何其他消息都需要等待管道中的容量。等待 space 释放的最佳方法是使用 await myPipeline.SendAsync(data)。整个管道总共有 6 个容量。