我需要有关 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。出于这个原因,我尝试使用任务工厂:
decimal[] numbers;
Task.Factory.StartNew(() =>
{numbers = getNumbers(bitmap, dictionary1);});
string[] text;
Task.Factory.StartNew(() =>
{text = getText(bitmap, dictionary2);});
textBox1.Text = "" + text[0]; // nothing
但是我没有得到任何结果..
那么在我的案例中是否可以实现多线程?我必须使用哪种方法?
- 任务工厂
- 后台 worker
- 线程
- 还是别的?
如果可能的话,你能给我一些关于如何使用你的方法的建议吗,因为当我尝试使用它时 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当您访问它时,它将等待任务完成并返回任务的结果。
关于c# - 使用多线程与 C# 进行 OCR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9859619/