我正在尝试设计一个程序,该程序使用外部 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/