Odpowiedzi SLaks i Killercam są dobre; Pomyślałem, że po prostu dodam trochę więcej kontekstu.
Twoje pierwsze pytanie dotyczy zasadniczo tego, jakie metody można oznaczyć async
.
Sposób oznaczone async
może powrócić void
, Task
albo Task<T>
. Jakie są między nimi różnice?
Task<T>
Powrocie sposób asynchroniczny może być oczekiwany, a po zakończeniu wykonywania zadania będzie to propozycja górę T.
ZA Task
Powrocie sposób asynchroniczny może być oczekiwany, a gdy finalizuje zadaniowe, kontynuacja zadania jest zaplanowane do uruchomienia.
void
Powrocie sposób asynchroniczny nie może być oczekiwany; jest to metoda „odpal i zapomnij”. Działa asynchronicznie i nie możesz powiedzieć, kiedy się skończy. To więcej niż trochę dziwne; jak mówi SLaks, normalnie zrobiłbyś to tylko podczas tworzenia asynchronicznej obsługi zdarzeń. Zdarzenie jest wyzwalane, program obsługi wykonuje; nikt nie będzie „czekał” na zadanie zwrócone przez moduł obsługi zdarzeń, ponieważ programy obsługi zdarzeń nie zwracają zadań, a nawet gdyby tak było, jaki kod użyłby zadania do czegoś? Zwykle to nie kod użytkownika przekazuje kontrolę do programu obsługi w pierwszej kolejności.
Twoje drugie pytanie w komentarzu dotyczy zasadniczo tego, co można await
edytować:
Jakie rodzaje metod można await
edytować? Czy można edytować metodę zwracającą pustkę await
?
Nie, nie można oczekiwać metody zwracającej pustkę. Kompilator tłumaczy await M()
na wywołanie funkcji M().GetAwaiter()
, gdzie GetAwaiter
może być metodą instancji lub metodą rozszerzającą. Oczekiwana wartość musi być wartością, za którą można dostać awaitera; oczywiście metoda zwracająca void nie tworzy wartości, z której można uzyskać awaiter.
Task
metody zwrotne mogą dawać oczekiwane wartości. Przewidujemy, że osoby trzecie będą chciały tworzyć własne implementacje Task
podobnych obiektów, na które można czekać, a Ty będziesz mógł na nie czekać. Jednak nie będzie można deklarować async
metod, które zwracają coś innego niż void
, Task
lub Task<T>
.
(AKTUALIZACJA: Moje ostatnie zdanie może zostać sfałszowane przez przyszłą wersję C #; istnieje propozycja zezwalająca na zwracanie typów innych niż typy zadań dla metod asynchronicznych).
(AKTUALIZACJA: wspomniana powyżej funkcja została wprowadzona do języka C # 7).