Search code examples
c#asynchronoustesseract

How can I use async to increase WinForms performance?


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

Solution

  • 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.