2013-02-19 3 views
23

私はいくつかのプロセッサの重い作業をしていました。そのコマンドを実行するたびに、私のwinformがフリーズします。私はマイクロソフトから同じ手順を使用しましたが、何も変更されていないようです。非同期を使用してWinFormsのパフォーマンスを向上させるにはどうすればよいですか?

私の作業環境は、.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

答えて

50

はい、あなたはまだUIスレッドにすべての作業をやっているとのVisual Studio 2012です。 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。同様のサンプルの詳細な説明を含むもう1つのリンク - http://visualstudiomagazine.com/articles/2012/08/01/performance-tips.aspx –

+0

は、この行には表示しないでください。 'Task task = Task.Run(()= > ProcessFile(file)); 'これは次のようなものです:' Task task = Task.Run(()=> return ProcessFile(file)); – Prokurors

+2

@Prokurors:いいえ。式のラムダ式にはreturn文がありません。 –

2

新しいスレッドでタスクを開始することによってもこれを行うことができます。 Thread.StartまたはThreadだけを使用してください。 ParameterizedThreadStart

は、ご参考のためにこれらを参照してください:あなたはまだない待つ何に精通していないよう

http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx

Start thread with parameters

+1

タスクはこれを実行する新しい方法です。スレッドよりもはるかに柔軟で直感的です。 –

関連する問題