Möglicherweise finden Sie meinen MSDN-Artikel zu diesem Thema hilfreich . Ich nahm viel Platz in diesem Artikel beschreiben , wenn Sie sollten verwenden async
auf ASP.NET, nicht nur , wie die Verwendung async
auf ASP.NET.
Ich habe einige Probleme bei der Verwendung von asynchronen Aktionen in ASP.NET MVC. Wann verbessert es die Leistung meiner Apps und wann - nicht.
Verstehe zunächst, dass es bei async
/ await
darum geht , Threads freizugeben . Bei GUI-Anwendungen geht es hauptsächlich darum , den GUI-Thread freizugeben, damit die Benutzererfahrung besser wird. Bei Serveranwendungen (einschließlich ASP.NET MVC) geht es hauptsächlich darum , den Anforderungsthread freizugeben, damit der Server skalieren kann.
Insbesondere wird es nicht:
- Machen Sie Ihre individuellen Anfragen schneller. Tatsächlich werden sie (nur ein kleines bisschen) langsamer abgeschlossen.
- Kehren Sie zum Anrufer / Browser zurück, wenn Sie eine drücken
await
. await
"ergibt" nur dem ASP.NET-Thread-Pool, nicht dem Browser.
Die erste Frage lautet: Ist es gut, überall in ASP.NET MVC asynchrone Aktionen zu verwenden?
Ich würde sagen, es ist gut, es überall dort zu verwenden, wo Sie E / A ausführen. Dies muss jedoch nicht unbedingt von Vorteil sein (siehe unten).
Es ist jedoch schlecht , es für CPU-gebundene Methoden zu verwenden. Manchmal denken Entwickler, dass sie die Vorteile nutzen können, async
indem sie einfach Task.Run
ihre Controller anrufen , und das ist eine schreckliche Idee. Da dieser Code den Anfragethread durch Aufnehmen eines anderen Threads freigibt, gibt es überhaupt keinen Vorteil (und tatsächlich werden zusätzliche Thread-Schalter bestraft)!
Soll ich asynchrone / warte Schlüsselwörter verwenden, wenn ich eine Datenbank abfragen möchte (über EF / NHibernate / anderes ORM)?
Sie können alle verfügbaren Methoden verwenden, die Ihnen zur Verfügung stehen. Im Moment unterstützen die meisten Hauptakteure async
, aber es gibt einige, die dies nicht tun. Wenn Ihr ORM dies nicht unterstützt async
, versuchen Sie nicht, es einzupacken Task.Run
oder ähnliches (siehe oben).
Beachten Sie, dass ich sagte "Sie könnten verwenden". Wenn Sie über ASP.NET MVC mit einem einzigen Datenbank-Backend sprechen, werden Sie (mit ziemlicher Sicherheit) keinen Vorteil in Bezug auf die Skalierbarkeit erzielen async
. Dies liegt daran, dass IIS weitaus mehr gleichzeitige Anforderungen verarbeiten kann als eine einzelne Instanz von SQL Server (oder einem anderen klassischen RDBMS). Allerdings, wenn Ihr Backend modernere ist - eine SQL - Server - Cluster, Azure SQL, NoSQL, usw. - und Backend können skaliert und Ihre Skalierbarkeit Engpass ist IIS, dann können Sie von einer Skalierbarkeit profitieren zu bekommen async
.
Dritte Frage - Wie oft kann ich auf Schlüsselwörter warten warten, um die Datenbank in EINER einzelnen Aktionsmethode asynchron abzufragen?
So viele wie du willst. Beachten Sie jedoch, dass viele ORMs eine Regel für eine Operation pro Verbindung haben. Insbesondere erlaubt EF nur eine einzige Operation pro DbContext; Dies gilt unabhängig davon, ob die Operation synchron oder asynchron ist.
Beachten Sie auch die Skalierbarkeit Ihres Backends. Wenn Sie auf eine einzelne Instanz von SQL Server zugreifen und Ihr IIS bereits in der Lage ist, SQLServer auf voller Kapazität zu halten, hilft es Ihnen überhaupt nicht, den Druck auf SQLServer zu verdoppeln oder zu verdreifachen.