2012-04-20 25 views
16

Sigue aprendiendo sobre async-await. Me encontré con ejemplos similares a los siguientes:Espera en la última línea de método

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

¿Cuál es el propósito de la última espera? Method02Async es la última línea del método MethodAsync. Así que no hay ningún resto de método, no hay líneas debajo, no hay nada que llamar en la devolución de llamada generada por el compilador ... ¿Me falta algo?

Respuesta

17

En realidad hay un "resto del método" - completa el Task devuelto por MethodAsync.

(El valor de retorno de) Method02Async se espera para que MethodAsync no se complete hasta que Method02Async finalice.

Si tuviera:

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

Entonces el MethodAsync será (asíncrona) esperar a que Method01Async para completar y luego empezar a Method02Async. MethodAsync se completará mientras que Method02Async aún puede estar en progreso.

La forma en que lo tienes:

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

Significa que se MethodAsync (asíncrona) esperar a que Method01Async para completar y luego (asíncrona) esperar a que Method02Async para completar, y sólo entonces MethodAsync completa.

+5

En particular, imagine si Method02Async fuera, por ejemplo, Task.Delay (5000). Sería extremadamente extraño si alguien dijera "aguarde MethodAsync()" y luego esa tarea se completó * antes de que * se completara el retraso. –

+0

Pero no es mejor escribir "return Method02Async();" como la última línea? – duduamar

+0

@duduamar: Eso no compilaría a menos que elimine 'async' de' MethodAsync'. Lo que significa que tendrías que eliminar 'await' de' Method01Async' también. Un cambio considerable en el comportamiento. –

Cuestiones relacionadas