Puede encontrar útil mi artículo de MSDN sobre el tema ; Tomé mucho espacio en ese artículo que describe cuándo debe usar async
ASP.NET, no solo cómo usar async
ASP.NET.
Tengo algunas preocupaciones al usar acciones asincrónicas en ASP.NET MVC. Cuando mejora el rendimiento de mis aplicaciones y cuándo no.
Primero, comprenda que async
/ await
se trata de liberar hilos . En las aplicaciones GUI, se trata principalmente de liberar el hilo GUI para que la experiencia del usuario sea mejor. En aplicaciones de servidor (incluido ASP.NET MVC), se trata principalmente de liberar el hilo de solicitud para que el servidor pueda escalar.
En particular, no:
- Haga que sus solicitudes individuales se completen más rápido. De hecho, se completarán (solo un poquito) más lentamente.
- Regrese a la persona que llama / al navegador cuando golpea un
await
. await
solo "cede" al grupo de subprocesos ASP.NET, no al navegador.
La primera pregunta es: ¿es bueno usar la acción asíncrona en todas partes en ASP.NET MVC?
Yo diría que es bueno usarlo donde sea que esté haciendo E / S. Sin embargo, puede no ser necesariamente beneficioso (ver más abajo).
Sin embargo, es malo usarlo para métodos vinculados a la CPU. A veces, los desarrolladores piensan que pueden obtener los beneficios async
simplemente llamando Task.Run
a sus controladores, y esta es una idea horrible. Debido a que ese código termina liberando el subproceso de solicitud al tomar otro subproceso, por lo que no hay ningún beneficio en absoluto (y de hecho, ¡están tomando la penalidad de los cambios de subproceso adicionales!
¿Debo usar palabras clave asíncronas / en espera cuando deseo consultar la base de datos (a través de EF / NHibernate / otro ORM)?
Podrías usar cualquier método que tengas disponible. En este momento, la mayoría de los jugadores principales son compatibles async
, pero hay algunos que no. Si su ORM no es compatible async
, no intente envolverloTask.Run
ni nada por el estilo (ver arriba).
Tenga en cuenta que dije " podría usar". Si está hablando de ASP.NET MVC con un único back-end de base de datos, entonces (casi seguro) no obtendrá ningún beneficio de escalabilidad async
. Esto se debe a que IIS puede manejar muchas más solicitudes concurrentes que una sola instancia del servidor SQL (u otro RDBMS clásico). Sin embargo, si su back-end es más moderno (un clúster de servidor SQL, Azure SQL, NoSQL, etc.) y su back-end puede escalar y su cuello de botella de escalabilidad es IIS, entonces puede obtener un beneficio de escalabilidad async
.
Tercera pregunta: ¿cuántas veces puedo usar palabras clave en espera para consultar la base de datos de forma asincrónica en UN método de acción único?
Tantos como quieras. Sin embargo, tenga en cuenta que muchos ORM tienen una regla de una operación por conexión. En particular, EF solo permite una sola operación por DbContext; Esto es cierto si la operación es síncrona o asíncrona.
Además, tenga en cuenta la escalabilidad de su back-end nuevamente. Si está llegando a una sola instancia de SQL Server y su IIS ya es capaz de mantener SQLServer a plena capacidad, duplicar o triplicar la presión sobre SQLServer no lo ayudará en absoluto.