gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:30:27 27 4
gpt4 key购买 nike

我正在开发 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com