Ich versuche die async CTP, die Version 4.5, die es ermöglicht, async Methoden zu verwenden, ohne die Begin/End Methoden schreiben zu müssen.
Meine erste Probe ist die Ausführung einer async Methode, die void zurückgibt. Ich sehe ein paar Beispiele und mache folgendes:
private void btnAsync01_Click(object sender, RoutedEventArgs e)
{
UpdateTxtLog("Klick auf die Schaltfläche: " + System.DateTime.Now);
method01Async();
UpdateTxtLog("nach ethod01Async: " + System.DateTime.Now);
}
private async void method01Async()
{
await TaskEx.Run(() =>
{
UpdateTxtLog("Betritt method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("Verlassen von method01Async: " + System.DateTime.Now);
});
}
In meinem WPF-Projekt habe ich ein TextBox, in dem ich die Ergebnisse sehe, und eine Schaltfläche, die die async Methode ausführt.
In der async Methode verwende ich await, was nötig ist, da die Methode async ist, und TaskEx.Run, um einen neuen Thread zu erstellen, in dem der Code ausgeführt wird.
Meine Zweifel liegen an diesem Punkt. Bei ein paar Beispielen, die ich gesehen habe, wie man eine async Methode erstellt, die void zurückgibt, wird auf diese Weise, Task.Run oder TaskEx.Run, zurückgegriffen.
Wenn ich mich nicht irre, erstellt Task.Run einen neuen Thread, in dem die Methode ausgeführt wird. Warum also eine async Methode verwenden, wenn ich mit der Task, die einen neuen Thread erstellt, erreiche, was ich will, nämlich den Hauptthread nicht zu blockieren?
Außerdem, wenn die async Methode auf eine gemeinsam genutzte Variable zugreift, muss ich auf die Parallelität achten, richtig? Also ich sehe den Vorteil der Verwendung von async Methoden nicht, zumindest in diesem Fall.
Tatsächlich verwende ich denselben Code ohne async und ohne await und das Ergebnis ist dasselbe, das Hauptprogramm wird nicht blockiert und alles funktioniert wie erwartet. Die Methode lautet wie folgt:
private void method01Async()
{
TaskEx.Run(() =>
{
UpdateTxtLog("Betritt method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("Verlassen von method01Async: " + System.DateTime.Now);
});
}
Meine Frage lautet, ist dies der richtige Weg, um async zu verwenden, wenn die Methode void zurückgibt?