2012-03-25 98 views
3

我需要WinForms C#应用程序中的多线程实现的建议。我们有一个图像 - 与文字号码并且有单独的方法到OCR不同类型的数据。例如:使用多线程与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..) 

其结果是,整个proccess需要大约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 

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

所以是有可能implemet在我的情况下,多线程?我必须使用哪种方法?

  • 任务工厂
  • 后台工作
  • 螺纹
  • 或其他什么东西?

如果可能的话,你可以给我如何使用你的方法有点意见,因为TaskFactory失败,当我试图使用它(如例子)。

编辑:

好像

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

被执行的速度比

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

这就是为什么文本框栏位是空..让我感动“textBox1.Text = “” +文字[0];“在代码的最后,终于得到了结果..

编辑2:

OK,任务不作任何区别..我得到同样的速度测试结果没有他们。

+0

您的实际代码是否等待任务完成? – erikH 2012-03-25 11:10:54

+0

不..这就是问题 – Alex 2012-03-25 11:14:47

回答

4

你正在开始正确的任务,但你永远不会等待他们完成。你想要做的是类似于;

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,当您访问它时将等待任务完成并返回任务结果。

+0

谢谢!我刚刚得出同样的结论!看编辑;) – Alex 2012-03-25 11:09:16

+0

任务没有任何区别..我得到相同的速度测试结果没有他们。 – Alex 2012-03-25 13:08:00

+0

@Alex很难在没有看到新代码的情况下进行解释,但是您是否首先启动所有任务并在运行后访问结果?如果您在开始下一个任务之前分别等待每项任务的结果,您会得到相同的效果。 – 2012-03-25 13:20:47