2012-04-20 3 views
16

Lernen Sie immer noch über Async-erwarten. Ich stieß auf Beispiele ähnlich wie folgt:Warten Sie auf die letzte Methodenzeile

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

Was ist der Zweck der letzten erwarten? Methode02Async ist die letzte Zeile der MethodAsync-Methode. Also gibt es keinen methodischen Rest - keine Zeilen darunter - nichts, was in dem vom Compiler erzeugten Callback aufgerufen werden könnte ... Fehle ich irgendetwas?

Antwort

17

Es ist tatsächlich eine "Methode Rest" - es vervollständigt die Task zurückgegeben von MethodAsync.

(Der Rückgabewert von) Method02Async wird erwartet, so dass MethodAsync nicht abgeschlossen ist, bis Method02Async abgeschlossen ist.

Wenn Sie hatte:

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

Dann wird die MethodAsync wird (asynchron) für Method01Async warten zu vervollständigen und dann Method02Async starten. MethodAsync wird dann abgeschlossen, während Method02Async möglicherweise noch in Bearbeitung ist.

Die Art und Weise haben Sie es:

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

Bedeutet, dass MethodAsync wird (asynchron) für Method01Async warten zu vervollständigen und dann (asynchron) warten Method02Async abgeschlossen ist, und erst dann wird MethodAsync abgeschlossen.

+5

Insbesondere vorstellen, wenn Methode02Async war, sagen wir, Task.Delay (5000). Es wäre äußerst merkwürdig, wenn jemand "methodAsync() erwarten" würde und diese Aufgabe dann abgeschlossen wäre * bevor * die Verzögerung abgeschlossen war! –

+0

Aber ist es nicht besser, "return Method02Async();" als letzte Zeile? – duduamar

+0

@duduamar: Das würde nicht kompilieren, wenn Sie nicht den 'async' von' MethodAsync' entfernen. Das bedeutet, dass Sie auch '' erwarten '' von 'Method01Async' entfernen müssen. Eine erhebliche Verhaltensänderung. –