Die Antworten von SLaks und Killercam sind gut; Ich dachte, ich würde nur ein bisschen mehr Kontext hinzufügen.
Ihre erste Frage betrifft im Wesentlichen, welche Methoden markiert werden können async
.
Eine Methode, die als zurückgegeben werden async
kann void
, Task
oder Task<T>
. Was sind die Unterschiede zwischen ihnen?
Eine Task<T>
zurückkehrende asynchrone Methode kann erwartet werden, und wenn die Aufgabe abgeschlossen ist, wird ein T angeboten.
Eine Task
zurückkehrende asynchrone Methode kann abgewartet werden. Wenn die Aufgabe abgeschlossen ist, soll die Fortsetzung der Aufgabe ausgeführt werden.
Eine void
zurückkehrende asynchrone Methode kann nicht erwartet werden. Es ist eine "Feuer und Vergessen" -Methode. Es funktioniert asynchron und Sie können nicht sagen, wann es fertig ist. Das ist mehr als ein bisschen komisch; Wie SLaks sagt, würden Sie dies normalerweise nur tun, wenn Sie einen asynchronen Ereignishandler erstellen. Das Ereignis wird ausgelöst, der Handler wird ausgeführt. Niemand wird auf die vom Ereignishandler zurückgegebene Aufgabe "warten", da Ereignishandler keine Aufgaben zurückgeben, und selbst wenn dies der Fall wäre, welcher Code würde die Aufgabe für etwas verwenden? Normalerweise überträgt der Benutzercode die Kontrolle überhaupt nicht an den Handler.
Ihre zweite Frage in einem Kommentar betrifft im Wesentlichen das, was bearbeitet werden kann await
:
Welche Arten von Methoden können await
bearbeitet werden? Kann eine Methode zur Rückgabe von Leeren await
bearbeitet werden?
Nein, eine Rückgabemethode kann nicht erwartet werden. Der Compiler übersetzt await M()
in einen Aufruf von M().GetAwaiter()
, wobei es sich GetAwaiter
möglicherweise um eine Instanzmethode oder eine Erweiterungsmethode handelt. Der erwartete Wert muss einer sein, für den Sie einen Kellner erhalten können. Es ist klar, dass eine Methode zur Rückgabe von Leeren keinen Wert erzeugt, von dem Sie einen Kellner erhalten können.
Task
-Rückgabemethoden können erwartete Werte erzeugen. Wir gehen davon aus, dass Dritte ihre eigenen Implementierungen von Task
ähnlichen Objekten erstellen möchten, auf die gewartet werden kann, und dass Sie darauf warten können. Allerdings werden Sie nicht erlaubt werden , zu erklären , async
alles Methoden , die Rückkehr aber void
, Task
oder Task<T>
.
(UPDATE: Mein letzter Satz dort wird möglicherweise durch eine zukünftige Version von C # verfälscht. Es gibt einen Vorschlag, andere Rückgabetypen als Aufgabentypen für asynchrone Methoden zuzulassen.)
(UPDATE: Die oben erwähnte Funktion hat es in C # 7 geschafft.)