Подтвердить что ты не робот

Как я могу использовать async для повышения производительности WinForms?

Я выполнял тяжелую задачу с процессором, и каждый раз, когда я начинаю выполнять эту команду, моя winform замерзает, чем я не могу даже переместить ее, пока задача не будет завершена. Я использовал ту же процедуру у Microsoft, но ничего не изменилось.

моя рабочая среда - это 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();
    }
}
4b9b3361

Ответ 1

Да, вы все еще делаете всю работу над потоком пользовательского интерфейса. Использование 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 (тяжелый кусок работы) выполняется в другом потоке.