web-dev-qa-db-fra.com

Comment puis-je utiliser async pour augmenter les performances de WinForms?

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();
    }
}
26
Serak Shiferaw

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.

53
Jon Skeet

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

Démarrer le fil avec les paramètres

2
David Smithers