Antwort auf Ihre Frage: der zweite Ansatz könnte Probleme mit entsorgten Objekte verursachen, müssen Sie Ende der SendAsync
Ausführung warten, bevor Sie Ressourcen freigeben können.
Detaillierte Erklärung.
Wenn Sie await
aufrufen, wird die Ausführung einer Methode im selben Moment gestoppt und nicht fortgesetzt, bis die gewünschte Methode nicht zurückgegeben wird. Die vermittelte Nachricht wird in einer lokalen versteckten Variablen gespeichert und nicht entsorgt.
Wenn Sie nicht await
aufrufe, wird die Ausführung fortsetzen und alle Ressourcen der vermittelten Nachricht werden befreit werden, bevor sie tatsächlich verbraucht werden oder in dem Prozess des Verbrauchs (wie using
wird Dispose
auf Objekt am Ende Aufruf). Dies führt definitiv zu Ausnahmen innerhalb SendAsync
. Zu diesem Zeitpunkt wird die Ausführung von SendAsync
tatsächlich gestartet.
Was await
tut ist "pausiert" jeden aktuellen Thread und wartet auf Abschluss der Aufgabe und es ist das Ergebnis. Und das brauchst du wirklich. Zweck von async-await
ist es, die Ausführung einer Aufgabe gleichzeitig mit etwas anderem zu erlauben, es bietet die Möglichkeit, auf ein Ergebnis der gleichzeitigen Operation zu warten, wenn es wirklich notwendig ist und eine weitere Ausführung ohne sie nicht möglich ist.
Der erste Ansatz ist gut, wenn jede Methode nach oben auch eine asynchrone Methode ist. Ich meine, wenn der Aufrufer von Ihrem SendAsync Async-Task ist, und der Aufrufer dieses Aufrufers und so weiter an die oberste Aufrufmethode.
Beachten Sie auch Ausnahmen, die sich erhöhen könnten, sie sind aufgeführt here. Wie Sie sehen können, gibt es sogenannte transiente Fehler. Dies ist eine Art von Fehlern, die durch einen erneuten Versuch behoben werden können. In Ihrem Code gibt es keine solche Ausnahmebehandlung. Beispiel für ein Wiederholungsmuster könnte gefunden werden here, aber der erwähnte Artikel über Ausnahmen kann bessere Lösungen vorschlagen und es ist ein Thema einer anderen Frage. Ich würde auch ein Logging-System hinzufügen, um zumindest über nicht-flüchtige Ausnahmen informiert zu sein.
Nur neugierig: Warum möchten Sie nicht auf dasselbe wie SendAsync erwarten? – cassandrad
@cassandrad Wenn Sie "erwarten" verwenden, heißt das eigentlich, dass Sie den Anruf "ausführen", nicht wahr? –
Ja, die Ausführung startet sofort und blockiert nichts bevor Sie darauf warten. Gibt es irgendwelche Probleme damit? – cassandrad