How can I use async to increase WinForms performan

2019-01-07 09:07发布

i was doing some processor heavy task and every time i start executing that command my winform freezes than i cant even move it around until the task is completed. i used the same procedure from microsoft but nothing seem to be changed.

my working environment is visual studio 2012 with .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();
    }
}

2条回答
Melony?
2楼-- · 2019-01-07 09:18

You can also do this by starting your task in new thread. Just use Thread.Start or Thread. ParameterizedThreadStart

See these for your reference:

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

Start thread with parameters

查看更多
Melony?
3楼-- · 2019-01-07 09:20

Yes, you're still doing all the work on the UI thread. Using async isn't going to automatically offload the work onto different threads. You could do this though:

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

The use of Task.Run will mean that ProcessFile (the heavy piece of work) is executed on a different thread.

查看更多
登录 后发表回答