2012-10-08 17 views
12

In einer WPF 4.5-Anwendung, ich verstehe nicht, warum die UI blockiert wird, wenn ich await verwendet + eine neue Aufgabe:Meine async Aufgabe immer Blöcke UI

private async void Button_Click(object sender, RoutedEventArgs e) 
    { 
     // Task.Delay works great 
     //await Task.Delay(5000); 

     double value = await JobAsync(25.0); 

     MessageBox.Show("finished : " + value.ToString()); 
    } 

    private async Task<double> JobAsync(double value) 
    { 
     for (int i = 0; i < 30000000; i++) 
      value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); 

     return value; 
    } 

Das erwarten Task.Delay funktioniert gut, aber die Warten Sie, bis JobAsync die Benutzeroberfläche blockiert. Warum ? Danke.

Antwort

9

Try this:

private Task<double> JobAsync(double value) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     for (int i = 0; i < 30000000; i++) 
      value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); 

     return value; 
    }); 
} 
+2

Anstatt dem Start der Aufgabe absorbieren sie mehr machen könnte Sinn, einen 'Task.Run'-Aufruf in der Zeile mit' wartet 'hinzuzufügen, obwohl das Endergebnis (wenn die Funktion nie wieder verwendet wird) identisch ist. – Servy

+2

Ich bin in einem ähnlichen Szenario, blockiert immer noch den UI-Thread. Gibt es offensichtliche Fallstricke? – IbrarMumtaz

23

Sie sollten eine Warnung über JobAsync bekommen - es enthält keine await Ausdrücke. Alle Ihre Arbeit wird noch auf dem UI-Thread ausgeführt. Es ist wirklich nichts asynchron an der Methode.

Das Markieren einer Methode wie async führt nicht dazu, dass sie auf einem anderen Thread ausgeführt wird - es vereinfacht eher das Zusammenführen asynchroner Operationen und das Zurückkehren zum entsprechenden Kontext.

Ich vermute, es wäre eine gute Idee sein, einen Schritt zurück zu gehen und innerhalb des Verfahrens einige der Materialien über async auf MSDN ... this is a good starting point ...

+0

Ok danke, ich verstehe jetzt :) – Nico