En .Net 4.5, Microsoft ha agregado la nueva Async/Await
función para simplificar la codificación asincrónica. Sin embargo, me pregunto
- ¿Puede
Async/Await
reemplazar completamente la antigua forma de usoThreads
? - ¿Es
Async/Await
capaz de hacer todo lo queThread
pueda hacer de forma asincrónica? - ¿
Async/Await
Solo se puede usar con algunos métodos comoWebClient.DownloadStringAsync
o puedo convertir cualquier método síncrono para que se useAsync/Await
y no para bloquear el hilo principal?
new Thread(() => {Some Work}).Start();
está haciendo! no esRespuestas:
No. Un hilo puede hacer muchas más cosas útiles. Await está diseñado específicamente para lidiar con algo que toma tiempo, generalmente una solicitud de E / S. Lo que tradicionalmente se hacía con una devolución de llamada cuando se completaba la solicitud de E / S. Escribir código que se base en estas devoluciones de llamada es bastante difícil, await lo simplifica enormemente.
Aproximadamente. Await solo se encarga de lidiar con el retraso, de lo contrario no hace nada de lo que hace un hilo. La expresión de espera , que está a la derecha de la palabra clave de espera, es lo que hace el trabajo. Idealmente, no usa un hilo en absoluto, publica una solicitud de controlador y una vez que el controlador completa la transferencia de datos, genera una devolución de llamada de notificación de finalización. La conexión en red es, con mucho, el uso más común, las latencias de cientos de milisegundos son comunes y un efecto secundario inevitable de los servicios que se mueven desde el escritorio o una LAN a "la nube". El uso de estos servicios de forma sincrónica haría que una interfaz de usuario no respondiera.
No. Puede usarlo con cualquier método que devuelva una tarea. Los métodos XxxxAsync () son solo métodos precocinados en el marco .NET para operaciones comunes que requieren tiempo. Como descargar datos de un servidor web.
fuente
async
no son adecuados.await Task.Run
por el trabajo vinculado a la CPU. Si entiendo correctamente, eso a veces logra lo que de otro modo se crearía un hilo, o un trabajador en segundo plano, para hacer.La declaración oficial sobre esto. Aunque debe comprender las diferencias entre los hilos y la programación asincrónica antes de reemplazar ciegamente una cosa por otras.
fuente
await Task.Run
. Hay una breve mención de Task.Run, pero no está claro. La conclusión es queawait
por sí solo no hará que una tarea vinculada a la CPU se ejecute en paralelo, por lo tanto, dicho trabajo debe realizarse a través deawait Task.Run
.Lo pienso de esta manera (y creo que Microsoft también lo hace si miras https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110) ) # hilos )
Async / await es una forma rápida de ejecutar código en el subproceso principal de la aplicación con la ventaja de que el código puede suspenderse cuando no tiene trabajo que hacer y devolver el foco al subproceso principal, "despertar" en el subproceso principal cuando hay es un resultado que se debe obtener y luego pasar el procesamiento de nuevo a, lo adivinó, el hilo principal. Piense en ello como una declaración GOTO basada en eventos en Basic que puede pasar el control hacia adelante y hacia atrás a una línea de ejecución específica.
Por el contrario, un hilo es un flujo de ejecución independiente que puede ejecutarse con sus propias variables, etc. donde, dado el hardware suficiente, la ejecución se produce en paralelo al hilo principal.
Si tiene una aplicación GUI que va a descargar un solo archivo y luego hacer algo con ese archivo cuando se descargue, lo implementaría usando un método async / await.
Sin embargo, si su GUI necesita descargar 5000 archivos, crearía un hilo de descarga de archivos para manejar eso, ya que el hilo principal de la GUI puede congelarse mientras se transfiere la ejecución para manejar la descarga de los archivos.
fuente