Tropecé con esta publicación que habla sobre hacer solicitudes web asíncronas.
Ahora, aparte de la simplicidad, si en el mundo real, todo lo que haces es hacer una solicitud asíncrona y esperarla en la siguiente línea, ¿no es lo mismo que hacer una llamada de sincronización en primer lugar?
c#
.net
asynchronous-programming
Mrchief
fuente
fuente
Respuestas:
No,
async + await != sync
debido a la continuación.Desde MSDN 'Programación asincrónica con asíncrono y espera (C # y Visual Basic)'
Por ejemplo, la ejecución asincrónica no bloqueará el subproceso de la interfaz de usuario y
Some TextBox.Text
se actualizará una vez que la descarga haya finalizadofuente
Console.WriteLine(await GetStringOverNetwork());
? ¿Qué sucede si necesita la salida de la invocación asincrónica? ¿Se bloqueará el programa en el primer acceso, incluso si el hilo podría continuar la ejecución?No, no es lo mismo.
Su
async
bloque de código está esperando que laawait
llamada regrese para continuar, sin embargo, el resto de su aplicación no está esperando y aún puede continuar de manera normal.Por el contrario, una llamada síncrona haría que toda su aplicación o hilo espere hasta que el código termine de ejecutarse para continuar con cualquier otra cosa.
fuente
Permítanme aclarar cosas con respecto a async / wait.
Cuando se encuentra en espera, la máquina de estado subyacente permite que el control se devuelva de inmediato. Luego, cuando se completa la llamada esperada, la máquina de estado subyacente permite que la ejecución se reanude en la línea después de la llamada esperada.
Por lo tanto, el bloque asíncrono no está bloqueado ni está esperando que finalice la llamada esperada; El control se devuelve inmediatamente cuando se encuentra el comando de espera.
La máquina de estado subyacente es parte de la "magia" detrás del uso de async / wait que no se usa y se pierde.
fuente
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 :
¿Se
await
bloquea el contexto que se encuentra ?¿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 )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
: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 secuencialawait
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 individuoawait
.fuente