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

标签 c# parallel-processing

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

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

如果步骤 2-4 花费的时间超过一帧时间(30 毫秒),则会丢帧,这是我不希望看到的。

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

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

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

与其将进程的每个部分拆分成不同的线程,我更希望有一个线程池,每个线程都执行一个帧的整个处理过程。问题是如何维护结果的顺序。

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

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

更新

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

最佳答案

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

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

假设有一个方法

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

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

关于c# - 如何在保持顺序的同时并行处理队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49772165/

相关文章:

c# - 月份和年份的日期时间格式

c# - 将 C# GUI 组件封装在 DLL 中

r - 使用 foreach 函数和 doParallel 库在 R 中嵌套 for 循环

python - 如何在循环中使用 os.fork() 调用不同的函数?

c# - 有没有办法为重载运算符调用基方法? C#

c# - 避免将相同的现有行写入文本文档

c# - 访问 SFTP 站点 : The requested name is valid, 时出现异常,但未找到请求类型的数据

linux - 执行脚本的多个实例 - GNU Parallel

r - 保存 foreach dopar 循环的多个输出

.net - 多线程或任务并行库