2014-12-03 5 views
7

Ich war einige Codierung in ASP.NET zu tun, wenn ich über das kam:Ist die Verwendung von async/await in ASP.NET-Ereignishandlern sicher?

protected async void someButtonClickHandler(...) 
{ 
    if(await blah) 
     doSomething(); 
    else 
     doSomethingElse(); 
} 

Nach this Frage zu stellen ich ein besseres Verständnis davon, wie async/await Werke bekam. Aber dann ist es mir aufgefallen, ist es sicher, async/await in der oben gezeigten Weise zu verwenden?
Ich meine nach dem Aufruf await blah der Aufrufer setzt die Ausführung fort. Dies bedeutet, dass die Antwort möglicherweise auf den Client zurückgestellt wird, bevor await blah abgeschlossen wird. Ist das richtig? Und wenn das der Fall ist, was passiert mit doSomething()/doSomethingElse(). Werden sie jemals hingerichtet? Wenn sie ausgeführt werden, sieht der Benutzer die Auswirkungen ihrer Änderungen?
In meinem Fall ändern diese Methoden einige Daten, die dem Benutzer angezeigt werden, aber ich würde auch gerne wissen, was im allgemeinen Fall passieren würde.

+0

Ist dies für Webformulare? –

+0

@ JonathanAllen ja. – atoMerz

Antwort

13

Ja, es ist sicher, aber nicht wirklich empfehlenswert. Die recommended way to do this is via RegisterAsyncTask. ASP.NET (Web Forms) verarbeitet jedoch async void Event-Handler ordnungsgemäß.

Die Antwort wird dem Client nicht gerendert, wenn der Handler await s; Die await liefert nur die ASP.NET-Laufzeit, nicht auf dem Client. Die ASP.NET-Laufzeitumgebung ist sich bewusst, dass der Ereignishandler nicht abgeschlossen wurde, daher weiß er, dass die Antwort nicht gesendet werden muss. Nach Abschluss des Ereignishandlers reagiert die ASP.NET-Laufzeitumgebung durch Senden der Antwort zu diesem Zeitpunkt.

Ich habe eine MSDN article on async ASP.NET, die Sie hilfreich finden können. Wenn Sie sich darüber im Klaren sind, wie die ASP.NET-Laufzeitumgebung erkennt, dass der Handler async nicht abgeschlossen wurde, beziehe ich diesen in an earlier MSDN article.

+1

Ihr erster Link ist derzeit unterbrochen – Fredou

+1

@Fredou: Der Link ist korrekt; Es ist ein Problem mit der ASP.NET-Site. Drücken Sie einfach auf Aktualisieren, bis der Inhalt angezeigt wird. –

Verwandte Themen