使用多线程对C#进行OCR

提问

我需要有关WinForms C#应用程序中多线程实现的建议.我们有一幅图像-带有文本和数字,并且有单独的方法可以对不同类型的数据进行OCR.例如:

decimal[] numbers = getNumbers(bitmap, dictionary1);
string[] text = getText(bitmap, dictionary2);
int[] integers = getInts(bitmap, dictionary3);
// add 5 more data types (list, int[], etc..)

结果,整个过程大约需要1秒钟.

我当时正在考虑同时在不同的线程上运行OCR.因此,我尝试使用Task Factory:

decimal[] numbers;
Task.Factory.StartNew(() =>
{numbers = getNumbers(bitmap, dictionary1);});
string[] text;
Task.Factory.StartNew(() =>
{text = getText(bitmap, dictionary2);});
textBox1.Text = "" + text[0]; // nothing

但是我没有得到任何结果.

所以有可能在我的情况下实现多线程吗?我必须使用哪种方法?

>任务工厂
>后台工作者
>线程
>还是其他?

如果可能的话,您能给我一些关于如何使用您的方法的建议,因为TaskFactory在我尝试使用它时失败了(例如).

编辑:

似乎

textBox1.Text = "" + text[0];

被执行得比

string[] text;
Task.Factory.StartNew(() =>
{text = getText(bitmap, dictionary2);});

这就是TextBox字段为空的原因.所以我移动了“ textBox1.Text =”“ text [0];”在代码的最后,最后得到了结果.

编辑2:

好的,任务没有任何区别..如果没有它们,我将获得相同的速度测试结果.

最佳答案

您正在正确地启动任务,但从未等待它们完成.您想要做的事情类似于;

Task[] tasks = new Task[2];
decimal[] numbers;
tasks[0] = Task.Factory.StartNew(() =>
   {numbers = getNumbers(bitmap, dictionary1);});
string[] text;
tasks[1] = Task.Factory.StartNew(() =>
   {text = getText(bitmap, dictionary2);});

Task.WaitAll(tasks);  // Wait for all parallel tasks to finish 
                      // before using their output.

textBox1.Text = "" + text[0];

可以找到更多示例代码here.

或者,您可以从任务中返回值,而不是将其分配给变量,并使用Task.Result,当您访问它时,它将等待任务完成并返回任务的结果.