Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当ActionBlock开始或结束时,是否从BufferBlock中删除项?_C#_Task Parallel Library_Tpl Dataflow_Bufferblock - Fatal编程技术网

C# 当ActionBlock开始或结束时,是否从BufferBlock中删除项?

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将

假设我有一个容量为2的
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,一个在处理中,一个在缓冲区中,这是可以达到的最低容量。