26

我正在执行一些处理器繁重的任务,每次我开始执行该命令时,我的 winform 都会冻结,而在任务完成之前我什至无法移动它。我使用了微软的相同程序,但似乎没有任何改变。

我的工作环境是带有 .net 4.5 的 Visual Studio 2012

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

3 回答 3

54

是的,您仍在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(繁重的工作)在不同的线程上执行。

于 2013-02-19T16:56:26.097 回答
2

您也可以通过在新线程中启动您的任务来做到这一点。只需使用 Thread.Start 或 Thread。参数化ThreadStart

请参阅这些供您参考:

http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx

带参数启动线程

于 2013-02-19T23:21:29.837 回答
0

您可以使用BackgroundWorker组件。

于 2021-11-17T05:22:22.623 回答