2012-04-20 46 views
16

Nadal uczenie się o oczekiwaniu async. Wpadłem na przykłady podobne do następujących:Oczekiwanie na ostatnią linię metody

public async Task MethodAsync() 
{ 
    await Method01Async(); 
    await Method02Async(); 
} 

Jaki jest cel ostatniego czekania? Method02Async to ostatnia linia metody MethodAsync. Więc nie ma żadnej metody pozostającej - żadnych linii poniżej - nie ma nic, co można by nazwać w wywołaniu zwrotnym generowanym przez kompilator ... Czy brakuje mi czegoś?

Odpowiedz

17

W rzeczywistości istnieje "metoda ostatnia" - kończy ona Task zwróconą przez MethodAsync.

(Zwracana wartość) Method02Async jest oczekiwana, aby MethodAsync nie została zakończona do momentu zakończenia Method02Async.

Jeśli miał:

public async Task MethodAsync() 
{ 
    await Method01Async(); 
    Method02Async(); 
} 

Następnie MethodAsync będzie (asynchronicznie) czekać na Method01Async do zakończenia, a następnie uruchomić Method02Async. MethodAsync zakończy się wtedy, gdy Method02Async nadal będzie w toku.

Sposób masz go:

public async Task MethodAsync() 
{ 
    await Method01Async(); 
    await Method02Async(); 
} 

Czyli MethodAsync będzie (asynchronicznie) czekać na Method01Async do zakończenia, a następnie (asynchronicznie) czekać na Method02Async do wykonania, i tylko wtedy MethodAsync kompletne.

+5

W szczególności wyobraź sobie, że Method02Async to, powiedzmy, Task.Delay (5000). Byłoby niezmiernie dziwne, gdyby ktoś powiedział "czekaj na MethodAsync()", a następnie to zadanie zostało zakończone * przed * opóźnieniem zakończone! –

+0

Ale czy nie lepiej napisać "return Method02Async();" jako ostatnia linia? – duduamar

+0

@duduamar: To by się nie skompilowało, chyba że usuniesz 'async' z' MethodAsync'. Co oznacza, że ​​musielibyśmy również usunąć 'await' z' Method01Async'. Znaczna zmiana w zachowaniu. –

Powiązane problemy