C# TPL数据流:持久化以前的数据

C# TPL数据流:持久化以前的数据,c#,.net,task-parallel-library,tpl-dataflow,C#,.net,Task Parallel Library,Tpl Dataflow,我一直在使用TPL dataflow作为使用生产者/消费者模式的图像处理管道 我正试图找出一种最好的方法,以允许需要前一帧或持久对象的算法 其中一个过程的示例是背景减法,其中通过将当前帧与动态背景模型进行比较来找到前景遮罩 如何实现这一点的一个想法是在管道中创建一个循环: 有没有标准的方法来接近这种管道 是否存在与数据排序或异步操作相关的问题 您不需要在管道中使用循环来使事情复杂化,就像在图像中一样,您只需要将持久数据保存在一个变量中,该变量在调用处理函数之间保持不变 如果您使用的是lambd

我一直在使用TPL dataflow作为使用生产者/消费者模式的图像处理管道

我正试图找出一种最好的方法,以允许需要前一帧或持久对象的算法

其中一个过程的示例是背景减法,其中通过将当前帧与动态背景模型进行比较来找到前景遮罩

如何实现这一点的一个想法是在管道中创建一个循环:

有没有标准的方法来接近这种管道


是否存在与数据排序或异步操作相关的问题

您不需要在管道中使用循环来使事情复杂化,就像在图像中一样,您只需要将持久数据保存在一个变量中,该变量在调用处理函数之间保持不变

如果您使用的是lambda,则该变量可以是lambda之外的局部变量:

IPropagatorBlock<InputImage, OutputImage> CreateProcessingBlock()
{
    InputImage previousImage = null;

    return new TransformBlock<InputImage, OutputImage>(
        inputImage =>
        {
            var result = Process(inputImage, previousImage);
            previousImage = inputImage;
            return result;
        })
}
IPropagatorBlock CreateProcessingBlock()
{
InputImage previousImage=null;
返回新的转换块(
输入图像=>
{
var结果=过程(inputImage,previousImage);
previousImage=输入图像;
返回结果;
})
}
如果在某个对象上使用实例方法,则该变量可以是该对象上的实例字段:

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)
类处理器
{
输入以前的图像;
公共输出映像进程(输入映像输入映像)
{
var结果=过程(inputImage,previousImage);
previousImage=输入图像;
返回结果;
}
}
…
新TransformBlock(新处理器().进程)

为什么不保留一个数据成员呢?在第二个示例中,我想使用一个use-instance方法
myProcessor.Reset()
。将
myProcessor.Process
传递到块时,同时从块外部调用同一对象上的重置方法,是否存在任何问题?@JohnRedmond是的,如果这两个方法访问相同的成员,则需要确保它们以线程安全的方式执行此操作。具体如何做取决于细节,但通常最简单的选择是使用锁。