【问题标题】:Are items removed from BufferBlock when ActionBlock starts or ends?ActionBlock 开始或结束时是否会从 BufferBlock 中删除项目?
【发布时间】:2017-04-26 15:19:55
【问题描述】:

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

【问题讨论】:

    标签: c# task-parallel-library tpl-dataflow bufferblock


    【解决方案1】:

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

    【讨论】:

    • 感谢 JSteward。我没有意识到 ActionBlock 也在缓冲东西。我真正想要的是只有 2 个进程并行运行,但我不希望任何额外的作业是可缓冲的。因此,如果我两次调用 SendAsync,我希望第三次调用等到第一次调用完成。这可能吗?
    • 好的,如果你放弃BufferBlock,上面配置的单个ActionBlock将有4个容量。两个在处理中,两个在缓冲中,在给定时间只有两个作业正在处理尽管。不幸的是,将 BoundedCapacity 设置为 1 的块仍然会给你一个容量为 2 的块,一个在处理中,一个在缓冲区中,这是你可以达到的最低值。
    猜你喜欢
    • 2021-06-22
    • 2020-07-12
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多