2013-10-24 13 views
17

Ich war bei ASP.NET MVC 5 Vorlagen suchen, und ich habe bemerkt, dass viele der Aktionen und markiert als async:Async Aktionsmethoden

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { } 

Wann soll ich diese auf einer MVC-Aktion zu tun? Wenn es Zugriff auf eine Datenbank enthält?

Wenn ich ein Repository innerhalb der Aktion aufrufen, sollte ich auch Task verwenden, um es asynchron zu machen?

Antwort

11

Der Kern Ihrer Fragen ist: Wann sollte ich meine MVC-Aktionen asynchron machen? Eine gute Erörterung des Problems finden Sie unter http://blogs.msdn.com/b/rickandy/archive/2009/11/14/should-my-database-calls-be-asynchronous.aspx. Er redet nur von der Datenbank, aber seine Punkte gehen weiter.

Im Wesentlichen fast nie rufen Sie die Datenbank asynchron auf.

Für Datenbankanwendungen Asynchron-Operationen verwenden, ist die Anzahl der blockierten Threads auf dem Web-Server zu reduzieren fast immer eine komplette Zeitverschwendung.

Lassen Sie sich nicht von Leuten ablenken, die Ihnen sagen, dass Sie asynchrone IO immer verwenden sollten, wenn möglich. Async ist im Moment der letzte Schrei. Viele irrationale Ratschläge werden verbreitet.

+2

Sollte geändert werden, hat der Artikel, auf den verwiesen wird, ein Update vom 28. November 2012 mit ... "Die Kombination aus warten, async und dem Task-Objekt macht es viel einfacher für Sie, in .NET 4.5 asynchronen Code zu schreiben unterstützt asynchrone Abfrage und Speichern, sollten Sie die asynchrone Programmierung nutzen " –

+1

@PaulHatcher Ich bin mit dieser Schlussfolgerung überhaupt nicht einverstanden. Siehe meine anderen Stücke zu diesem Thema: http://stackoverflow.com/a/25087273/122718 und http://stackoverflow.com/a/12796711/122718. Wenn die ganze Community auf eine neue coole Technologie springt und niemand wirklich sagt warum, dann sollten Sie anfangen, Fragen zu stellen. – usr

9

Entity Framework 6 (wird standardmäßig mit MVC 5 verwendet) unterstützt jetzt asynchrone Datenbankaufrufe, daher wurden die Signaturen der Aktionsmethoden aktualisiert, um anzuzeigen, dass Async verwendet wird. Die einfache Antwort lautet: Verwenden Sie Async, wenn Sie eine Aufgabe haben, bei der möglicherweise gewartet werden muss. Es ist zu hoffen, dass Ihre Datenbankabfragen nicht lange genug dauern werden, um tatsächlich von Async zu profitieren, aber wenn Ihre Datenbank herunterfällt oder besonders hart getroffen wird, hilft das zumindest dabei, IIS nicht zu blockieren.

+0

Dieser Rat braucht Begründung. – usr

+0

@usr: Welche Art von Rechtfertigung suchen Sie? Die Begründung ist schon da. Sie geben IIS etwas Freiraum für zusätzliche Anfragen, wenn der Datenbankserver aus irgendeinem Grund besonders lange auf Anfragen reagiert. Die Art von async bedeutet, dass der Thread in einem Wartezustand in den Pool zurückgegeben werden kann, um andere Arbeit zu erledigen, anstatt dort gesperrten zu bleiben und auf den Abschluss der Aufgabe zu warten. –

+1

Wenn Sie erwarten, dass die DB in 10ms im Durchschnitt antwortet und es 10s dauert, können Sie alle gewünschten Threads zurückgeben. Die App ist nicht verfügbar. Threads sind in ASP.NET nicht selten. Es gibt standardmäßig Hunderte und keine gemeinsame Datenbank kann von so vielen parallelen Anfragen profitieren. Der Fall für asynchrone DB-Aufrufe ist schwach. – usr

5

Hier ist ein Artikel, der einige Anwendungsfälle auflistet, wenn die Verwendung von Aufgaben Vorteile hat und einige Anwendungen Fälle, die den gegenteiligen Effekt haben können. Die Antwort ist nicht jedes Mal so einfach, deshalb ist der letzte Punkt zum Testen.

Zitat von http://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4

In der Regel verwendet synchrone Methoden für die folgenden Bedingungen:

  • Die Operationen sind einfach oder mit kurzer Laufzeit.
  • Einfachheit ist wichtiger als Effizienz.
  • Bei den Operationen handelt es sich in erster Linie um CPU-Operationen statt um Operationen, die einen umfangreichen Festplatten- oder Netzwerk-Overhead erfordern. Die Verwendung asynchroner Aktionsmethoden für CPU-gebundene Operationen bietet keine Vorteile und führt zu mehr Overhead.

In der Regel verwenden asynchrone Methoden für die folgenden Bedingungen:

  • Sie Dienste aufrufen, die durch asynchrone Methoden verbraucht werden kann, und Sie .NET 4.5 oder höher verwenden.
  • Die Vorgänge sind netzwerkgebunden oder I/O-gebunden statt CPU-gebunden.
  • Parallelität ist wichtiger als Einfachheit des Codes.
  • Sie möchten einen Mechanismus bereitstellen, mit dem Benutzer eine lang andauernde Anfrage abbrechen können.
  • Wenn der Vorteil des Wechselns von Threads die Kosten für den Kontextwechsel ausgleicht. Im Allgemeinen sollten Sie eine asynchrone Methode erstellen, wenn die synchrone Methode auf den ASP.NET-Anforderungs-Thread wartet, während keine Arbeit ausgeführt wird. Wenn der Aufruf asynchron erfolgt, wird der ASP.NET-Anforderungs-Thread nicht angehalten, während er auf die Anforderung des Web-Service wartet, um zu arbeiten.
  • Tests zeigen, dass die blockierenden Vorgänge ein Engpass bei der Site-Leistung sind und dass IIS mehr Anforderungen verarbeiten kann, indem für diese blockierenden Aufrufe asynchrone Methoden verwendet werden.
Verwandte Themen