如何使用async来提高WinForms性能?

Ser*_*raw 26 c# asynchronous tesseract

我正在做一些处理器繁重的任务,每次我开始执行该命令时,我的winform冻结,我甚至无法移动它直到任务完成.我使用了与微软相同的程序,但似乎没有任何改变.

我的工作环境是使用.net 4.5的visual studio 2012

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 53

是的,您仍然在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Task.Run意味着ProcessFile(繁重的工作)在不同的线程上执行.

  • +1.还有一个链接,详细解释了类似的样本 - http://visualstudiomagazine.com/articles/2012/08/01/performance-tips.aspx (4认同)
  • @Prokurors:没有.表达式的lambda表达式没有return语句. (3认同)
  • @Prokurors:在这种情况下基本没什么区别.它们都是具有相同结果的lambda表达式.你不能将一个语句体的lambda转换成一个表达式树,这就是全部 - 在这种情况下无关紧要. (2认同)