Dopo questa domanda, mi sento a mio agio quando utilizzo le operazioni asincrone in ASP.NET MVC. Quindi, ho scritto due post sul blog su questo:
Ho troppi malintesi nella mente riguardo alle operazioni asincrone su ASP.NET MVC.
Sento sempre questa frase: l' applicazione può ridimensionarsi meglio se le operazioni vengono eseguite in modo asincrono
E ho sentito anche questo tipo di frasi: se hai un volume enorme di traffico, potresti essere meglio non eseguire le tue query in modo asincrono - consumare 2 thread extra per soddisfare una richiesta toglie risorse da altre richieste in arrivo.
Penso che queste due frasi siano incoerenti.
Non ho molte informazioni su come funziona threadpool su ASP.NET ma so che threadpool ha una dimensione limitata per i thread. Quindi, la seconda frase deve essere correlata a questo problema.
E vorrei sapere se le operazioni asincrone in ASP.NET MVC utilizzano un thread da ThreadPool su .NET 4?
Ad esempio, quando implementiamo un AsyncController, come viene strutturata l'app? Se ricevo traffico intenso, è una buona idea implementare AsyncController?
C'è qualcuno là fuori che può portare via questa tenda nera davanti ai miei occhi e spiegarmi l'accordo sull'asincronia su ASP.NET MVC 3 (NET 4)?
Modificare:
Ho letto questo documento di seguito quasi centinaia di volte e capisco l'affare principale, ma ho ancora confusione perché ci sono troppi commenti incoerenti.
Utilizzo di un controller asincrono in ASP.NET MVC
Modificare:
Supponiamo che io abbia un'azione del controller come di seguito (non un'implementazione di AsyncController
però):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
Come vedi qui, lancio un'operazione e me ne dimentico. Quindi, torno immediatamente senza aspettare che sia completato.
In questo caso, questo deve usare un thread da Threadpool? In tal caso, al termine, cosa succede a quel thread? Non GC
entra e ripulire subito dopo che completa?
Modificare:
Per la risposta di @ Darin, ecco un esempio di codice asincrono che parla al database:
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
}
}