Как я могу использовать 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();
}
}
Ответы
Ответ 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
(тяжелый кусок работы) выполняется в другом потоке.
Ответ 2
Вы также можете сделать это, запустив свою задачу в новом потоке.
Просто используйте Thread.Start или Thread. ParameterizedThreadStart
Смотрите их для справки:
http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx
Начать поток с параметрами