TPL Dataflow:持久化之前的数据

6
我一直在使用TPL数据流来处理图像处理管道,使用生产者/消费者模式。
我正在尝试找出最佳方法来允许需要先前帧或持久对象的算法。
其中一个这些过程的示例是背景减除,其中通过将当前帧与动态背景模型进行比较,找到前景掩码。
实现这个想法的一种方法是在管道中创建一个循环:
有没有标准的方法来处理这种类型的管道?
与数据排序或异步操作相关的问题有哪些?

4
为什么不直接保留数据成员? - i3arnon
1个回答

3
你不需要在管道中使用循环来使事情变得复杂,就像你的图片一样。你只需要将持久数据保存在一个变量中,该变量在处理函数之间保持不变即可。
如果你正在使用lambda表达式,那么该变量可以是lambda外部的局部变量:
IPropagatorBlock<InputImage, OutputImage> CreateProcessingBlock()
{
    InputImage previousImage = null;

    return new TransformBlock<InputImage, OutputImage>(
        inputImage =>
        {
            var result = Process(inputImage, previousImage);
            previousImage = inputImage;
            return result;
        })
}

如果您正在使用某个对象的实例方法,那么该变量可以是该对象上的实例字段:
class Processor
{
    InputImage previousImage;

    public OutputImage Process(InputImage inputImage)
    {
        var result = Process(inputImage, previousImage);
        previousImage = inputImage;
        return result;
    }
}

…

new TransformBlock<InputImage, OutputImage>(new Processor().Process)

在第二个例子中,假设我想使用一个实例方法 myProcessor.Reset()。如果同时将 myProcessor.Process 传递给块并从块外部调用同一对象的重置方法,是否会有任何问题? - John Redmond
1
@JohnRedmond 如果这两种方法访问相同的成员,那么您需要确保它们以线程安全的方式进行访问。如何做到这一点取决于具体细节,但通常最简单的选择是使用锁定。 - svick

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