私はいくつかのプロセッサの重いタスクを実行しており、そのコマンドの実行を開始するたびに、タスクが完了するまで、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();
}
}
はい、まだすべての作業を行っていますIスレッド上。 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を使用するだけです。 ParameterizedThreadStart
あなたの参照のためにこれらを見てください:
http://msdn.Microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx