我正在开发一个用于视频分析的C#程序,基本操作如下:
通过并行化可以降低平均时间,从而减少丢帧的可能性。然而,输出必须与输入的顺序相同。例如,带注释和结果的帧必须按正确顺序出现。
目前我提高程序速度的方法是将处理过程分成不同的部分,并将它们分别放入BlockingCollection中,例如使用不同的Tasks进行以下操作:
例如,我可以让每个线程将结果放入BlockingCollection中,但如果第二帧的处理比第一帧先完成,则结果将是无序的。
- 获取视频帧
- 处理帧
- 在帧上显示注释
- 将结果保存到硬盘
- 重复以上步骤
通过并行化可以降低平均时间,从而减少丢帧的可能性。然而,输出必须与输入的顺序相同。例如,带注释和结果的帧必须按正确顺序出现。
目前我提高程序速度的方法是将处理过程分成不同的部分,并将它们分别放入BlockingCollection中,例如使用不同的Tasks进行以下操作:
- 将帧添加到BC#1
- 从BC#1中获取帧,处理后将结果放入BC#2
- 从BC#2中取得结果,添加注释并显示,保存到磁盘。
例如,我可以让每个线程将结果放入BlockingCollection中,但如果第二帧的处理比第一帧先完成,则结果将是无序的。
- 有没有想法如何在C#中实现这一点?
- 有哪些C#类或库可以使用?
- 我应该使用什么来创建线程池以最大化性能?
MassTransit
nuget包含有InMemory消息队列系统。您可以通过参数发布Message
,其中一个消费者将接收该消息并执行相同的过程。但是,消费操作按顺序执行,返回结果不关心顺序。如果您逐个消费,则结果不会失去顺序属性。 - Adem CatamakSystem.Reactive
,也被称为反应式扩展吗?我正在使用它并取得了良好的结果。 - heltonbiker