DataflowBlockOptions.BoundedCapacity和BufferBlock<T>的区别

13

假设我有一个简单的ActionBlock<int>

var actionBlock = new ActionBlock<int>(_ => Console.WriteLine(_));

我可以指定一个有限的容量来启用缓冲:

var actionBlock = new ActionBlock<int>(
    _ => Console.WriteLine(_),
    new ExecutionDataflowBlockOptions
    { 
        BoundedCapacity = 1000
    });

创建一个 BufferBlock<T> 并将其链接到 actionBlock,是否更好,是否相同,还是多余的?


我也曾经想过这个问题。我最好的猜测是,它的预期用途是在流程中需要在分支处进行缓冲时使用。 - Cory Nelson
那么在这种情况下.. 多余的? - i3arnon
1个回答

11
如果仅在您的ActionBlock之前添加了有界的BufferBlock,则无法正常工作,因为ActionBlock仍然是无界的。因此,项目将继续积累在ActionBlock的输入队列中,实现不了任何功能。
如果添加了有界的BufferBlock并将ActionBlock的BoundedCapacity设置为1,则可以正常工作(加减1)。
这种方式并没有给你太多好处(除了增加一些小的开销),所以一般情况下,您应该只设置ActionBlock的BoundedCapacity。但是,在某些情况下,有界的BufferBlock和限制为1的ActionBlock的组合可能是有意义的。例如,当您想在创建ActionBlock后才设置容量时。

1
我正在查看帖子,试图找到答案,为什么一个具有BoundedCapacity=1的执行块似乎在启动时仍会接受两条消息。你所说的_那应该可以(加减1)_是什么意思? - mdisibio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接