Me topé con esto con la misma pregunta en mente, sin embargo, después de leer las respuestas, la pregunta parece persistir, confundida por las referencias a "magia bajo el capó".
De la programación asincrónica mencionada anteriormente :
- La
async
palabra clave convierte un método en un método asíncrono, que le permite utilizar la await
palabra clave en su cuerpo.
- Cuando
await
se aplica la palabra clave, suspende el método de llamada y devuelve el control a la persona que llama hasta que se complete la tarea esperada.
await
solo se puede usar dentro de un async
método.
¿Se await
bloquea el contexto que se encuentra ?
- Sí . Esa es esencialmente una barrera de sincronización local para mantener un estado conocido en el contexto de la ejecución; excepto que otros contextos, si los hay, no están unidos.
¿El resto de la aplicación se bloquea en el await
?
Depende de cómo se escriba su solicitud. Si se trata de una serie de await
tareas ed dependientes iniciadas secuencialmente en el mismo contexto (ver: Intentando entender un comportamiento asíncrono / en espera )
await asyncCall1();
await asyncCall2(); // waits for asyncCall1() to complete
de esta manera, cada uno await
bloquearía el desove del siguiente.
Por otro lado, las mismas tareas dependientes lanzadas en paralelo se ejecutarían en paralelo y el contexto solo se bloquearía en el resp. await
:
Task<int> t1 = asyncCall1();
Task<string> t2 = asyncCall2(); // runs in parallel with asyncCall1()
int val = await t1;
string str = await t2; // waits for asyncCall1() to complete
En general, el await
rendimiento se ejecuta en el contexto externo, desde donde se llama al contexto actual. Sin embargo, si el contexto externo en sí mismo espera la corriente, es como una secuencial await
en el mismo contexto.
Entonces, para cosechar los async
beneficios, uno necesita diseñar la aplicación para ejecutar varios contextos paralelos (UI, cliente de datos, etc.), luego, await
en un contexto, se ejecuta a otros contextos, para que toda la aplicación no se bloquee en un individuo await
.