web-dev-qa-db-ja.com

非同期を使用してWinFormsのパフォーマンスを向上させるにはどうすればよいですか?

私はいくつかのプロセッサの重いタスクを実行しており、そのコマンドの実行を開始するたびに、タスクが完了するまで、Winformが動かなくなってしまいます。マイクロソフトの同じ手順を使用しましたが、何も変更されていないようです。

私の作業環境は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();
    }
}
26
Serak Shiferaw

はい、まだすべての作業を行っていますIスレッド上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(作業の重い部分)が別のスレッドで実行されることを意味します。

53
Jon Skeet

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

あなたの参照のためにこれらを見てください:

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

スレッドをパラメータで開始

2
David Smithers