2013-02-19 45 views
23

我正在做一些處理器繁重的任務,每次我開始執行該命令時,我的winform凍結比我甚至不能移動它直到任務完成。我使用微軟的相同程序,但似乎沒有任何改變。如何使用異步來增加WinForms性能?

我的工作環境的Visual Studio 2012和.NET 4.5

private async void button2_Click(object sender, EventArgs e) 
{ 
    Task<string> task = OCRengine();   
    rtTextArea.Text = await task; 
} 

private async Task<string> OCRengine() 
{ 
    using (TesseractEngine tess = new TesseractEngine(
      "tessdata", "dic", EngineMode.TesseractOnly)) 
    { 
     Page p = tess.Process(Pix.LoadFromFile(files[0])); 
     return p.GetText(); 
    } 
} 
+1

看起來你還不熟悉的東西等着呢。我建議你閱讀一些基本的介紹。例如,等待不會安排線程。 – usr 2013-02-19 16:56:16

回答

50

是的,你仍然在做UI線程上的所有工作。使用async不會將工作自動卸載到不同的線程上。你可以這樣做,但:

private async void button2_Click(object sender, EventArgs e) 
{ 
    string file = files[0]; 
    Task<string> task = Task.Run(() => ProcessFile(file));  
    rtTextArea.Text = await task; 
} 

private string ProcessFile(string file) 
{ 
    using (TesseractEngine tess = new TesseractEngine("tessdata", "dic", 
                 EngineMode.TesseractOnly)) 
    { 
     Page p = tess.Process(Pix.LoadFromFile(file)); 
     return p.GetText(); 
    } 
} 

採用Task.Run將意味着ProcessFile(重件作品)是在不同的線程執行。

+4

+1。另外一個鏈接與類似示例的詳細解釋 - http://visualstudiomagazine.com/articles/2012/08/01/performance-tips.aspx – 2013-02-19 17:02:36

+0

不應該是這一行的任務 task = Task.Run((=)= > ProcessFile(file));'像這樣:'Task task = Task.Run(()=> return ProcessFile(file));'? – Prokurors 2015-11-14 19:25:50

+2

@Prokurors:沒有。表達式的lambda表達式沒有返回語句。 – 2015-11-14 19:43:43