我正在使用C#程序来分析视频。基本操作是:
如果步骤2-4花费的时间超过一帧时间(30毫秒),那么它会删除帧,这是我不想要的。
并行化将减少平均时间,从而降低丢帧的可能性。但是,输出必须与输入的顺序相同。例如。带注释的帧和结果必须以正确的顺序出现。
我目前加快速度的方法是将流程分成几部分,然后将每个流程分成一个BlockingCollection,例如:在不同的任务中有
我不想将流程的每个部分拆分成不同的线程,而是希望拥有一个线程池,每个线程都执行一个帧的整个处理。问题是如何维持结果的顺序。
例如,我可以让每个线程将结果放入BlockingCollection中,但如果帧#2在帧#1之前完成处理,则结果将无序。
更新
结果应该以接近实时的方式显示给用户,因为程序用于控制某些仪器,因此之后对结果进行排序可能是不可行的。
答案 0 :(得分:1)
最简单的方法可能是使用PLinQ中的.AsParallel()
:
var processedFrames = frames.AsParallel()
.AsOrdered()
.Select(Process)
.ToList();
假设有一种方法
ProcessedFrame Process(UnprocessedFrame original)
{
// ...
}
这会处理整个序列,结果会得到一个有序的结果帧序列。