2012-08-02 2 views
5

Ich habe eine Variation der Vorteile von-async/gay-avon-on-ASP.NET von this question.ASP.NET Async/erwarten Teil 2

Mein Verständnis ist, dass Asynchronität nicht das gleiche wie Parallelität ist. Auf einem Webserver frage ich mich, wie viel Nutzen async/await auf ASP.NET-Seiten bringt.

Ist IIS + ASP.NET nicht wirklich gut darin, Threads für Anfragen zuzuweisen, und wenn die Onen-Seite mit dem Warten auf eine Ressource beschäftigt ist, wechselt der Server einfach zur Verarbeitung einer anderen Anfrage, die etwas zu tun hat?

Es gibt eine begrenzte Anzahl von Threads im Pool, die von ASP.NET verwendet werden können - verwendet Async sie effektiver?

Wie Herr Skeet bei der Beantwortung der obigen Frage darauf hingewiesen hat, sprechen wir nicht über das Blockieren eines UI-Threads. Wir sind bereits multi-threaded und die Web-Antwort kann nicht abgeschlossen werden, bis alle Aufgaben der Anfrage erledigt sind, asynchron oder nicht, oder?

Ich denke, was es läuft darauf hinaus, dies ist unten:

Gibt es irgendeinen Vorteil zu einem Asynchron-Lese einer Ressource (zB eine Datei oder DB Anfrage) in einer ASP.NET-Seite auf sie vs. blockieren?

+0

Haben Sie tatsächlich die Antwort von Jon Skeet gelesen, die Sie erwähnt haben? Er erläutert die Vorteile der Verwendung von Async in ASP.NET. – svick

+0

@svick: Danke fürs Lesen. Ja, ich lese Jons Antwort, aber in so vielen Fällen sagt er "es kommt darauf an", was ich denke, ist die EINZIGE Antwort, die er * geben kann. Ich würde gerne die Threading-Implikationen von async/awa auf einem Massen-Webserver verstehen. – n8wrl

Antwort

8

Wenn eine Seite mit dem Warten auf eine Ressource beschäftigt ist, wechselt der Server einfach zur Verarbeitung einer anderen Anfrage, die erledigt werden muss.

Ich glaube nicht. Ich wäre sehr überrascht, wenn dies der Fall wäre. Es ist theoretisch möglich, aber sehr komplex.

Es gibt eine begrenzte Anzahl von Threads im Pool, die ASP.NET verwenden kann - verwendet async sie effektiver?

Ja, denn wenn Sie await etwas, wird der Thread für diese Anfrage sofort in den Pool zurückgegeben.

Wir sind bereits multi-threaded und die Web-Antwort kann nicht abgeschlossen werden, bis alle Aufgaben der Anfrage erledigt sind, async oder nicht, oder?

Das ist richtig. async In einem Server-Szenario geht es nur darum, Druck auf den Thread-Pool zu vermeiden.

Gibt es einen Vorteil für eine asynchrone Lesezugriff auf eine Ressource (sagen Sie eine Datei oder DB-Anfrage) in einer ASP.NET-Seite vs. Blockierung auf?

Absolut!

Wenn Sie eine Datei-/Serviceaufruf-/db-Anfrage blockieren, wird dieser Thread für die Dauer dieser Operation verwendet. Wenn Sie await eine Datei/Service-Aufruf/DB-Anforderung, dann wird dieser Thread sofort an den Thread-Pool zurückgegeben.

Ein (wirklich cool!) Ergebnis davon ist, dass Sie eine Anfrage in Bearbeitung haben können, und während es (a) einige Operation wartet, gibt es keine Threads, die diese Anfrage bearbeiten! Zero-threaded Concurrency, wenn Sie so wollen.

Wenn der Vorgang abgeschlossen ist, wird die Methode nach dem await - auf einem (möglicherweise anderen) Thread aus dem Thread-Pool fortgesetzt.

Fazit: async Skalen besser als Threads, so gibt es definitiv einen Vorteil auf der Serverseite.

Weitere Informationen: meine eigenen intro to async post und this awesome video.

+0

Vorteilseinschränkung von dieser neueren [Antwort] (http://stackoverflow.com/a/30574578/1497596) von Ihnen: "Wenn Sie über ASP.NET MVC mit einem einzelnen Datenbank-Backend sprechen, dann sind Sie ((fast sicher) keine Skalierbarkeit von Async profitieren. Dies liegt daran, dass IIS viel mehr gleichzeitige Anforderungen als eine einzelne Instanz von SQL Server (oder andere klassische RDBMS). Wenn jedoch Ihr Backend ist moderner - ein SQL Server-Cluster, Azure SQL, NoSQL usw. - und Ihr Back-End kann skaliert werden, und Ihr Skalierbarkeitsengpass ist IIS, * dann * können Sie einen Skalierbarkeitsvorteil von 'async' erhalten." – DavidRR