Nach dieser Frage kann ich problemlos asynchrone Vorgänge in ASP.NET MVC verwenden. Also habe ich zwei Blog-Beiträge dazu geschrieben:
Ich habe zu viele Missverständnisse über asynchrone Vorgänge unter ASP.NET MVC.
Ich höre immer diesen Satz: Die Anwendung kann besser skaliert werden, wenn Vorgänge asynchron ausgeführt werden
Und ich habe diese Art von Sätzen auch oft gehört : Wenn Sie ein großes Verkehrsaufkommen haben, ist es möglicherweise besser, wenn Sie Ihre Abfragen nicht asynchron ausführen. Wenn Sie zwei zusätzliche Threads für die Bearbeitung einer Anfrage benötigen, werden Ressourcen von anderen eingehenden Anfragen abgezogen.
Ich denke, diese beiden Sätze sind inkonsistent.
Ich habe nicht viele Informationen darüber, wie Threadpool unter ASP.NET funktioniert, aber ich weiß, dass Threadpool eine begrenzte Größe für Threads hat. Der zweite Satz muss sich also auf dieses Thema beziehen.
Und ich möchte wissen, ob asynchrone Vorgänge in ASP.NET MVC einen Thread von ThreadPool unter .NET 4 verwenden.
Wie strukturiert die App beispielsweise, wenn wir einen AsyncController implementieren? Ist es eine gute Idee, AsyncController zu implementieren, wenn ich großen Datenverkehr bekomme?
Gibt es jemanden da draußen, der diesen schwarzen Vorhang vor meinen Augen wegnehmen und mir den Deal über Asynchronität unter ASP.NET MVC 3 (NET 4) erklären kann?
Bearbeiten:
Ich habe dieses Dokument fast hunderte Male gelesen und verstehe das Hauptgeschäft, aber ich habe immer noch Verwirrung, weil es zu viele inkonsistente Kommentare gibt.
Verwenden eines asynchronen Controllers in ASP.NET MVC
Bearbeiten:
Nehmen wir an, ich habe eine Controller-Aktion wie unten (keine Implementierung von AsyncController
):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
Wie Sie hier sehen, feuere ich eine Operation ab und vergesse sie. Dann kehre ich sofort zurück, ohne darauf zu warten, dass es abgeschlossen ist.
Muss in diesem Fall ein Thread aus dem Threadpool verwendet werden? Wenn ja, was passiert nach Abschluss des Vorgangs mit diesem Thread? Kommt es GC
rein und räumt es gleich nach Abschluss auf?
Bearbeiten:
Für die Antwort von @ Darin finden Sie hier ein Beispiel für asynchronen Code, der mit der Datenbank kommuniziert:
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
}
}