Después de esta pregunta, me siento cómodo cuando uso las operaciones async en ASP.NET MVC. Por lo tanto, he escrito dos entradas de blog en que:Realice operaciones asíncronas en ASP.NET MVC use un hilo de ThreadPool en .NET 4
tengo demasiados malentendidos en mi mente acerca de las operaciones asincrónicas en ASP.NET MVC.
siempre escucho esta frase: La aplicación puede escalar mejor si las operaciones se ejecutan de forma asíncrona
Y oí este tipo de frases mucho también: si tiene un gran volumen de tráfico, Es mejor que no realice sus consultas de forma asíncrona, ya que consume 2 hilos adicionales para atender una solicitud que quita recursos de 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 los subprocesos. 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 utilizan un hilo de ThreadPool en .NET 4?
Por ejemplo, cuando implementamos AsyncController, ¿cómo se estructura la aplicación? Si recibo mucho tráfico, ¿es una buena idea implementar AsyncController?
¿Hay alguien afuera que pueda quitarme esta cortina negra delante de 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 que el acuerdo principal, pero aún tengo la confusión porque hay demasiado inconsistente comentario por ahí.
Using an Asynchronous Controller in ASP.NET MVC
Editar:
Supongamos que tengo acción del controlador, como a continuación (no una implementación de AsyncController
sin embargo):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
Como se ve aquí, enciendo una operación y olvídate de eso. Luego, regreso de inmediato 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é le sucede a ese hilo? ¿GC
entra y se limpia justo después de que se completa?
Editar:
Por toda respuesta, el @ de Darin, aquí es 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
}
}
No estoy seguro de la respuesta, pero vale la pena señalar asincrónico y multi-threading son cosas diferentes. Entonces, sería posible tener un número fijo de hilos con manejo asíncrono. Lo que sucedería es cuando una página tiene que bloquear, por ejemplo, E/S, otra página tendría la oportunidad de ejecutarse en el mismo hilo. Así es como ambas afirmaciones pueden ser ciertas, async puede hacer que las cosas sean más rápidas pero demasiados hilos es un problema. –
@ChrisChilvers Sí, el multihilo no siempre es necesario en la operación asincrónica. Ya me lo imaginé, pero creo que no tengo ningún controlador sobre eso hasta donde sé. AsyncController crea cuántos hilos desea desde mi punto de vista pero tampoco está seguro de eso. ¿Hay una noción de threadpool en aplicaciones de escritorio como WPF también? Creo que el número de subprocesos no es un problema en ese tipo de aplicaciones. – tugberk
Eche un vistazo al video [Enhebrado con Jeff Richter] (http://channel9.msdn.com/Shows/AppFabric-tv/AppFabrictv-Threading-with-Jeff-Richter) – oleksii