c# - 跨线程拆分工作

标签 c# .net multithreading

目前,我逐帧处理从视频中读取的帧,然后将它们写入文件。这看起来效率低且速度慢,所以我想将工作拆分到多个线程。

我目前的代码可以这样总结:

for(long n = 0; n < totalframes; n++) {
    using(Bitmap frame = vreader.ReadVideoFrame()) {
        Process(frame); //awfully slow
        WriteToFile(frame);
    }
}

我怎样才能加载,比方说,四帧,在四个线程中处理它们,等待它们全部完成,然后将它们写入文件? 帧的写入顺序与视频中的顺序完全相同,这一点至关重要。

最佳答案

您可以使用例如 Parallel.ForEach() 处理帧.然后使用迭代器 block ( IEnumerable<> ) 读取它们。

但写作需要多加注意。确保为每个帧附加一个数字,并在处理结束时将它们转储到 BlockingCollection<T> 中。 .启动一个单独的线程(Task)来处理队列并按顺序写入帧。这是一个经典的 n-Producer/1-Consumer 解决方案。

关于c# - 跨线程拆分工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16882318/

相关文章:

.net - 两个表在 lambda 表达式中具有多个连接条件

java - java中的事件循环

c# - 每个套接字地址仅使用一种

objective-c - NSOperation & 单例 : Correct concurency design

c# - 拥有终结器的开销 - 在 Dispose 中有/没有 SuppressFinalize

c# - 如何在 XML 配置中声明 Unity InjectionFactory

c# - 复杂密码的正则表达式

c# - 在没有代理客户端的情况下使用 WCF 服务

c# - 解决 XUnit2 项目的依赖关系,类似于处理 MVC6 Core 1.0 项目的方式

c# - 在应用程序设置中保存当前日期时间