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 asyncmoże powrócić void, Taskalbo 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 TaskPowrocie sposób asynchroniczny może być oczekiwany, a gdy finalizuje zadaniowe, kontynuacja zadania jest zaplanowane do uruchomienia.
voidPowrocie 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 awaitedytować:
Jakie rodzaje metod można awaitedytować? 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 GetAwaitermoż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.
Taskmetody zwrotne mogą dawać oczekiwane wartości. Przewidujemy, że osoby trzecie będą chciały tworzyć własne implementacje Taskpodobnych obiektów, na które można czekać, a Ty będziesz mógł na nie czekać. Jednak nie będzie można deklarować asyncmetod, które zwracają coś innego niż void, Tasklub 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).