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
asyncpalabra clave convierte un método en un método asíncrono, que le permite utilizar la awaitpalabra clave en su cuerpo.
- Cuando
awaitse 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.
awaitsolo se puede usar dentro de un asyncmétodo.
¿Se awaitbloquea 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 awaittareas 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 awaitbloquearí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 awaitrendimiento 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 awaiten el mismo contexto.
Entonces, para cosechar los asyncbeneficios, uno necesita diseñar la aplicación para ejecutar varios contextos paralelos (UI, cliente de datos, etc.), luego, awaiten un contexto, se ejecuta a otros contextos, para que toda la aplicación no se bloquee en un individuo await.