C# 当ActionBlock开始或结束时,是否从BufferBlock中删除项?
假设我有一个容量为2的C# 当ActionBlock开始或结束时,是否从BufferBlock中删除项?,c#,task-parallel-library,tpl-dataflow,bufferblock,C#,Task Parallel Library,Tpl Dataflow,Bufferblock,假设我有一个容量为2的BufferBlock,我将它链接到(使用LinkTo())一个MaxDegreeOfParallelism=2的ActionBlock。现在,我知道我将能够立即向缓冲区发送2个项目,ActionBlock将立即开始处理它们。但假设这些操作需要几秒钟才能完成。当第一个操作正在运行时,我是否能够将另外两个项目发送到缓冲区,或者是仅在消耗该项目的操作完成后才从缓冲区中删除的项目?如果您的ActionBlock具有未绑定容量,则缓冲区上的绑定容量无关紧要,ActionBlock将
BufferBlock
,我将它链接到(使用LinkTo()
)一个MaxDegreeOfParallelism=2的ActionBlock。现在,我知道我将能够立即向缓冲区发送2个项目,ActionBlock将立即开始处理它们。但假设这些操作需要几秒钟才能完成。当第一个操作正在运行时,我是否能够将另外两个项目发送到缓冲区,或者是仅在消耗该项目的操作完成后才从缓冲区中删除的项目?如果您的ActionBlock
具有未绑定容量,则缓冲区上的绑定容量无关紧要,ActionBlock
将缓冲所有项目,直到内存耗尽。但是,如果将操作块上的BoundedCapcity
设置为2,并将MaxDegreeParallelism
设置为2,则将处理两条消息并在其缓冲区中保存两条消息。然后,缓冲块将缓冲另外两条消息。任何其他消息都需要等待管道中的容量。等待空间释放的最佳方法是使用等待myPipeline.SendAsync(数据)
。整个管道的总容量为6。谢谢JSteward。我不知道ActionBlock也在缓冲东西。我真正想要的是只有两个进程并行运行,但我不希望任何额外的作业是可缓冲的。因此,如果我调用SendAsync两次,我希望第三次调用等待第一次调用中的一次完成。这可能吗?好的,如果您放下BufferBlock
,按照上述配置的单个ActionBlock
的容量将为4。两个在处理中,两个缓冲,但在给定的时间内只处理两个作业。不幸的是,如果将BoundedCapacity
设置为1,块的容量仍然为2,一个在处理中,一个在缓冲区中,这是可以达到的最低容量。