2012-03-25 129 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