C#.Net - 线程在一个循环中抓取相同的文件

标签 c# .net multithreading ocr

我正在尝试设计一个程序,该程序使用外部 OCR 应用程序来翻转图像,直到其右侧朝上。所有图像位置都保存在文件 [] 中。

问题是,一次处理一个文件太慢,无法处理我拥有的数万张图像。我需要启动 OCR 程序的多个实例以同时扫描多个图像。

我糟糕的实现如下:

public Program(string[] files)
    {
        for(int i = 0; i < files.Length; i++)
        {
            ThreadStart start = () => {flip(files[i]);};
            Thread t = new Thread(start);
            t.Start();
            if(i % 5 == 0)
            {
                t.Join();
            }
        }
    }

该代码应该启动 OCR 程序的 5 个实例。每五分之一,它会等待线程关闭,然后再继续。这应该充当缓冲区。

但是,实际情况是重复文件被传递到 OCR 程序中,而不是每次迭代都传递一个不同的文件。不同的线程正在抓取同一个文件。当 OCR 应用程序的不同实例开始处理同一个文件时,这会导致崩溃。

有没有人知道发生了什么,或者知道我可以采用完全不同的方法?

最佳答案

您遇到了一个名为访问修改后的闭包的问题。 i 的值随着线程的启动而变化。更改代码以改用局部变量。

        for (int i = 0; i < args.Length; i++)
        {
            int currenti = i;
            ThreadStart start = () => { flip(files[currenti]); };
            Thread t = new Thread(start);
            t.Start();
            if (i % 5 == 0)
            {
                t.Join();
            }
        }

关于C#.Net - 线程在一个循环中抓取相同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21394306/

相关文章:

c# - 无法加载文件或程序集 'Newtonsoft.Json,版本 = 3.5.0.0

c# - 使用 C#.Net 编程大小大于 2 GB 的文件

c# - 静态类中的 Thread.Sleep()

c# - 实例化要在类库中使用的委托(delegate)方法

c++ - SetTimer 函数是在后台运行还是进入休眠状态?

java - Java多线程,如何停止?

c# - MediaPlayer C#的线程问题

c# - 为什么 Crystal 报表总是提示参数不正确?在c#中动态生成报表时?

c# - 基于(强制转换)接口(interface)的 LINQ where 子句

c# - 带有 List<T> 的 SerializationBinder