如何在保持顺序

时间:2018-04-11 10:03:50

标签: c# parallel-processing

我正在使用C#程序来分析视频。基本操作是:

  1. 抓取视频框
  2. 流程框架
  3. 带注释的显示框
  4. 将结果保存到磁盘
  5. 重复
  6. 如果步骤2-4花费的时间超过一帧时间(30毫秒),那么它会删除帧,这是我不想要的。

    并行化将减少平均时间,从而降低丢帧的可能性。但是,输出必须与输入的顺序相同。例如。带注释的帧和结果必须以正确的顺序出现。

    我目前加快速度的方法是将流程分成几部分,然后将每个流程分成一个BlockingCollection,例如:在不同的任务中有

    1. 将帧添加到BC#1
    2. 从BC#1取框,处理,将结果放入BC#2
    3. 从BC#2获取结果,添加注释并显示,保存到磁盘。
    4. 我不想将流程的每个部分拆分成不同的线程,而是希望拥有一个线程池,每个线程都执行一个帧的整个处理。问题是如何维持结果的顺序。

      例如,我可以让每个线程将结果放入BlockingCollection中,但如果帧#2在帧#1之前完成处理,则结果将无序。

      • 有关如何在C#中实现此功能的任何想法?
      • 是否有一个有用的C#类或库?
      • 我应该使用什么来创建线程池以最大限度地提高性能?

      更新

      结果应该以接近实时的方式显示给用户,因为程序用于控制某些仪器,因此之后对结果进行排序可能是不可行的。

1 个答案:

答案 0 :(得分:1)

最简单的方法可能是使用PLinQ中的.AsParallel()

var processedFrames = frames.AsParallel()
                            .AsOrdered()
                            .Select(Process)
                            .ToList();

假设有一种方法

ProcessedFrame Process(UnprocessedFrame original)
{
    // ...
}

这会处理整个序列,结果会得到一个有序的结果帧序列。