je faisais une tâche lourde du processeur et chaque fois que je commence à exécuter cette commande, mon winform se bloque que je ne peux même pas le déplacer jusqu'à ce que la tâche soit terminée. j'ai utilisé la même procédure de Microsoft mais rien ne semble avoir changé.
mon environnement de travail est visual studio 2012 avec .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();
}
}
Oui, vous faites toujours tout le travail sur le thread d'interface utilisateur. L'utilisation de async
ne va pas décharger automatiquement le travail sur différents threads. Vous pouvez le faire cependant:
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();
}
}
L'utilisation de Task.Run
signifiera que ProcessFile
(la lourde tâche) est exécutée sur un autre thread.
Vous pouvez également le faire en démarrant votre tâche dans un nouveau thread. Utilisez simplement Thread.Start ou Thread. ParameterizedThreadStart
Voir ceux-ci pour votre référence:
http://msdn.Microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx