我在做一些处理任务繁重而每一次我开始执行该命令我的winform冻结比我不能,甚至直到任务完成移动它时。 我用同样的方法从微软,但没有似乎改变。
我的工作环境的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();
}
}
是的,你仍然在做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或螺纹。 ParameterizedThreadStart
看到这些,供大家参考:
http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx
先从参数线