当 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 个容量。
假设我有一个 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 个容量。