2013-02-19 26 views
23

Stavo svolgendo un po 'di lavoro pesante sul processore e ogni volta che ho iniziato a eseguire quel comando il mio winform si blocca che non riesco nemmeno a spostarlo fino a quando l'attività non è completata. Ho usato la stessa procedura da Microsoft ma nulla sembra essere cambiato.Come posso utilizzare async per aumentare le prestazioni di WinForms?

il mio ambiente di lavoro è Visual Studio .NET 2012 con 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

Sembra che non siete ancora familiarità con ciò che attendere fa. Ti suggerisco di leggere alcune introduzioni di base. Attendere non pianifica i thread, ad esempio. – usr

risposta

50

Sì, si sta ancora facendo tutto il lavoro sul thread UI. L'utilizzo di async non trasferirà automaticamente il lavoro su thread diversi. Si potrebbe fare questo però:

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(); 
    } 
} 

L'uso di Task.Run significherà che ProcessFile (il pesante pezzo di lavoro) viene eseguito su un thread diverso.

+4

+1. Un altro collegamento con spiegazione dettagliata del campione simile - http://visualstudiomagazine.com/articles/2012/08/01/performance-tips.aspx –

+0

non dovrebbe questa riga 'Task task = Task.Run (() = > ProcessFile (file)); 'sii in questo modo:' Task task = Task.Run (() => return ProcessFile (file)); '? – Prokurors

+2

@Prokurors: No. Le espressioni lambda espressione-corpo non hanno dichiarazioni di ritorno. –

Problemi correlati