Después de esta pregunta, me hace sentir cómodo al usar operaciones asíncronas en ASP.NET MVC. Entonces, escribí dos publicaciones de blog sobre eso:
Tengo demasiados malentendidos en mi mente sobre las operaciones asincrónicas en ASP.NET MVC.
Siempre escucho esta oración: la aplicación puede escalar mejor si las operaciones se ejecutan de forma asincrónica
Y también escuché mucho este tipo de oraciones: si tiene un gran volumen de tráfico, es mejor que no realice sus consultas de forma asincrónica, ya que consumir 2 hilos adicionales para atender una solicitud le quita recursos a otras solicitudes entrantes.
Creo que esas dos oraciones son inconsistentes.
No tengo mucha información sobre cómo funciona threadpool en ASP.NET, pero sé que threadpool tiene un tamaño limitado para hilos. Entonces, la segunda oración tiene que estar relacionada con este tema.
¿Y me gustaría saber si las operaciones asincrónicas en ASP.NET MVC usan un hilo de ThreadPool en .NET 4?
Por ejemplo, cuando implementamos un AsyncController, ¿cómo se estructura la aplicación? Si obtengo mucho tráfico, ¿es una buena idea implementar AsyncController?
¿Hay alguien por ahí que pueda quitarme esta cortina negra frente a mis ojos y explicarme el trato sobre la asincronía en ASP.NET MVC 3 (NET 4)?
Editar:
He leído este documento a continuación casi cientos de veces y entiendo el trato principal, pero todavía tengo confusión porque hay demasiados comentarios inconsistentes.
Uso de un controlador asíncrono en ASP.NET MVC
Editar:
Supongamos que tengo una acción de controlador como la siguiente (no es una implementación de AsyncController
):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
Como puede ver aquí, disparo una operación y me olvido de eso. Luego, regreso inmediatamente sin esperar a que se complete.
En este caso, ¿esto tiene que usar un hilo de threadpool? Si es así, después de que se complete, ¿qué pasa con ese hilo? ¿ GC
Entra y limpia justo después de que se complete?
Editar:
Para la respuesta de @ Darin, aquí hay una muestra de código asíncrono que habla con la base de datos:
public class FooController : AsyncController {
//EF 4.2 DbContext instance
MyContext _context = new MyContext();
public void IndexAsync() {
AsyncManager.OutstandingOperations.Increment(3);
Task<IEnumerable<Foo>>.Factory.StartNew(() => {
return
_context.Foos;
}).ContinueWith(t => {
AsyncManager.Parameters["foos"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<Bars>>.Factory.StartNew(() => {
return
_context.Bars;
}).ContinueWith(t => {
AsyncManager.Parameters["bars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<FooBar>>.Factory.StartNew(() => {
return
_context.FooBars;
}).ContinueWith(t => {
AsyncManager.Parameters["foobars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
}
public ViewResult IndexCompleted(
IEnumerable<Foo> foos,
IEnumerable<Bar> bars,
IEnumerable<FooBar> foobars) {
//Do the regular stuff and return
}
}