26

私はいくつかのプロセッサ負荷の高いタスクを実行していましたが、そのコマンドの実行を開始するたびに、タスクが完了するまで移動することさえできず、winform がフリーズします。私はマイクロソフトから同じ手順を使用しましたが、何も変更されていないようです。

私の作業環境は、Visual Studio 2012 with .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();
    }
}
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();
    }
}

willの使用は、 (重い作業) が別のスレッドで実行されるTask.Runことを意味します。ProcessFile

于 2013-02-19T16:56:26.097 に答える
2

新しいスレッドでタスクを開始することによってもこれを行うことができます。Thread.Start または Thread を使用してください。パラメータ化されたスレッド開始

参照用にこれらを参照してください。

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

パラメータでスレッドを開始

于 2013-02-19T23:21:29.837 に答える