如何使用async来提高WinForms的性能
本文关键字:WinForms 性能 何使用 async | 更新日期: 2023-09-27 18:00:13
我正在执行一些处理器繁重的任务,每次我开始执行该命令时,我的winform都会冻结,直到任务完成,我甚至无法移动它。我使用了微软的相同程序,但似乎没有什么变化。
我的工作环境是visualstudio2012与.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();
}
}
是的,您仍在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();
}
}
Task.Run
的使用将意味着ProcessFile
(繁重的工作)在不同的线程上执行。
您也可以通过在新线程中启动任务来实现这一点。只需使用Thread.Start或Thread。参数化线程启动
请参阅以下内容以供参考:
http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx
使用参数启动线程
您可以使用BackgroundWorker组件。