作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发 C# 程序来分析视频。基本操作是:
如果步骤 2-4 花费的时间超过一帧时间(30 毫秒),则会丢帧,这是我不希望看到的。
并行化会减少平均时间,从而降低丢帧的可能性。但是,输出必须与输入的顺序相同。例如。带有注释的帧和结果必须以正确的顺序出现。
我目前加快速度的方法是将流程分成几个部分,并将每个部分输入一个 BlockingCollection,例如在不同的任务中有
与其将进程的每个部分拆分成不同的线程,我更希望有一个线程池,每个线程都执行一个帧的整个处理过程。问题是如何维护结果的顺序。
例如,我可以让每个线程将结果放入 BlockingCollection,但如果帧 #2 在帧 #1 之前完成处理,结果将乱序。
更新
结果应该接近实时地显示给用户,因为该程序用于控制某些仪器,因此事后对结果进行排序可能不可行。
最佳答案
最简单的方法可能是使用 PLinQ 中的 .AsParallel()
:
var processedFrames = frames.AsParallel()
.AsOrdered()
.Select(Process)
.ToList();
假设有一个方法
ProcessedFrame Process(UnprocessedFrame original)
{
// ...
}
这将处理您的整个序列,您将得到一个有序的结果帧序列。
关于c# - 如何在保持顺序的同时并行处理队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49772165/
我是一名优秀的程序员,十分优秀!