首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在保持顺序的同时并行处理队列

如何在保持顺序的同时并行处理队列
EN

Stack Overflow用户
提问于 2018-04-11 10:03:50
回答 1查看 174关注 0票数 3

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

  1. 抓取视频帧
  2. 工艺框架
  3. 带注解的显示框
  4. 将结果保存到磁盘
  5. 重复

如果步骤2-4需要超过一个帧时间(30‘t),那么它会删除帧,这是我不想要的。

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

我目前加快速度的方法是将过程分成几个部分,并将每个提要分成一个BlockingCollection,例如,在不同的任务中

  1. 将框架添加到BC #1
  2. 从BC #1中获取框架,处理,在BC#2中放置结果
  3. 从BC #2中获取结果,添加注释并显示,保存到磁盘。

与其将进程的每个部分分割成不同的线程,我想要的是让每个线程池完成对一个框架的整个处理。问题是如何维持结果的秩序。

例如,我可以让每个线程将结果放到一个BlockingCollection中,但是如果frame #2在frame #1之前完成了处理,结果就会乱七八糟。

  • 对于如何在C#中实现这一点,有什么想法吗?
  • 是否有有用的C#类或库?
  • 我应该使用什么来创建线程池以最大限度地提高性能?

更新

结果应该在接近实时显示给用户,因为程序是为了控制一些仪器,因此,排序的结果可能是不可行的。

EN

回答 1

Stack Overflow用户

发布于 2018-04-11 11:55:10

最简单的方法可能是从PLinQ中使用PLinQ:

代码语言:javascript
复制
var processedFrames = frames.AsParallel()
                            .AsOrdered()
                            .Select(Process)
                            .ToList();

假设有一种方法

代码语言:javascript
复制
ProcessedFrame Process(UnprocessedFrame original)
{
    // ...
}

这将处理整个序列,并作为结果得到一个有序的结果帧序列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49772165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档