Wenn die Methode void zurück, ist die gleiche, die Aufgabe an?

Ich versuche die async CTP, die versión 4.5 erlaubt die Verwendung von asynchronen Methoden, ohne zu schreiben, der Begin/End-Methoden.

Meine erste Sonde ist für die Ausführung einer asynchronen Methode, die "void" zurückgeben. Ich sehe ein paar Beispiele und das folgende tun:

private void btnAsync01_Click(object sender, RoutedEventArgs e)
{
    UpdateTxtLog("click button: " + System.DateTime.Now);
    method01Async();
    UpdateTxtLog("after ethod01Async: " + System.DateTime.Now);
}

private async void method01Async()
{
    await TaskEx.Run(() =>
    {
        UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
        Thread.Sleep(10000);
        UpdateTxtLog("exit method01Async: " + System.DateTime.Now);
    });
}

In meinem WPF-Projekt habe ich eine textBox, wo die Ergebnisse zu sehen, und eine Schaltfläche, führen Sie die async-Methode.

In der asynchronen Methode, die ich verwenden, erwarten, dass nötig ist, weil die Methode ist asynchron, und die TasEx.Führen Sie zum erstellen eines neuen thread, in dem Sie den code auszuführen.

Meine Zweifel in diesem Punkt. In ein paar Beispiele, die ich sehen, wie zum erstellen einer async-Methode, die void zurückgibt, verwenden Sie diese Weise, die Aufgabe.Laufen oder TaskEx.Laufen.

Wenn ich mich nicht Irre, Aufgabe.Führen Sie einen neuen thread erstellen, wo die Methode auszuführen. Dann warum verwenden eine asynchrone Methode, wenn mit der Aufgabe, das erstellen eines neuen thread habe ich bekommen, was ich will, nicht blockiert den main thread?

Auch, wenn Sie die async-Methode Zugriff auf gemeinsame variable, muss ich vorsichtig sein mit der Parallelität, richtig? Also ich weiß nicht, der Vorteil bei der Verwendung von async-Methoden, zumindest in diesem Fall.

In der Tat, ich benutze den gleichen code, ohne async und ohne zu erwarten und das Ergebnis ist das gleiche, das Hauptprogramm nicht blockiert, und alles funktioniert wie ich erwarte. Die Methode ist diese:

private void method01Async()
{
    TaskEx.Run(() =>
    {
        UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
        Thread.Sleep(10000);
        UpdateTxtLog("Exit method01Async: " + System.DateTime.Now);
    });
}

Meine Frage ist, ist dies die richtige Art und Weise zu verwenden, async, wenn die Methode "void" zurückgeben?

  • BTW, Die Visual Studio 11 Beta ist jetzt raus, der enthält die Funktionen von dem Async CTP-Version, mit einigen Verbesserungen und bug-fixes.
  • Und was ist der Vorteil von os mit async-Methode in diesem Fall, wenn in der Methode, die ich benutze eine Aufgabe, und die Aufgabe, verwenden Sie eine niew thread? Wenn ich direkt eine Aufgabe, ohne ein async-Methode, bekomme ich das Verhalten. Vielleicht async-Methoden haben mehr Sinn, wenn die Methode einen Wert zurückgeben und für void-Methoden, ist es besser, direkt eine Aufgabe?
  • Ich empfehle, dass alle async Methoden zurück Task oder Task<TResult> es sei denn, Sie sind event-Handler und zurück void. Dies ermöglicht Ihnen das schreiben Sie, wenn nötig, und Fehler-handling sauberer, auch wenn ein async void - Methode löst eine Ausnahme in einer WPF-Kontext, es wird direkt an den UI-nachrichtenschleife, so async void Methoden sind nicht wirklich "fire-and-forget").
  • Nutzen Sie auch Task.Run nur zum ausführen von code auf den thread-pool. Sie können Task.Delay für eine asynchrone warten, statt Warteschlangen eine Sperrung Sleep.
InformationsquelleAutor | 2012-04-06
Schreibe einen Kommentar