Gibt es eine Möglichkeit, von Page_Load
(oder einem anderen ASP.NET-Ereignis) umzuleiten, wenn async
- await
verwendet wird? Natürlich wirft Redirect
ThreadAbortException
, aber selbst wenn ich es mit try
- catch
abfange, endet es mit einer Fehlerseite. Wenn ich Response("url", false)
aufruft stürzt es nicht ab, aber ich muss die Ausführung der Seite stoppen (Rendering der Seite usw.), also ist es nicht die Lösung. Und wie ich bemerkt habe, verhalten sich diese zwei Methoden anders:
Dies endet mit ThreadAbortException (ich nehme an, die Aufgabe endet synchron):
%Vor%Dieser Vorgang wird nach Response.Redirect fortgesetzt:
%Vor% Ich muss auf die Antwort warten, aber ich experimentierte und selbst wenn ich das await
Schlüsselwort lösche (also Task läuft im Hintergrund und die Methode fortfährt), endet es gleich. Das einzige was hilft, ist das async
Schlüsselwort zu entfernen - ich dachte async
ONLY ermöglicht await
und nichts mehr?!
OK, ich habe die Antwort gefunden, wie ich damit umgehen kann.
Ich habe einen Redirect-Methodenwrapper in meiner Basis-Page-Klasse erstellt:
%Vor% Und überschreiben Sie Render
und RaisePostBackEvent
:
Das macht den Trick. ASP.NET 4.5 löst das Ereignis PreRenderComplete
(= wird im Lebenszyklus nicht fortgesetzt) nicht aus, bis alle erwarteten Aufgaben abgeschlossen sind.
Haftungsausschluss: Ich habe async
/ await
nicht verwendet, aber das Folgende basiert auf meinem Lesen der Dokumente.
Wie ich es verstehe, wenn Sie eine await
im Code haben, wird es die Aufgabe asynchron aufrufen und der Rest der Methode wird in eine Callback-Methode umgewandelt. In diesem Fall also, weil Page_Load
async ist, wenn es ausgeführt wird, und es zu einem Warten kommt, wird es die Kontrolle an den Aufrufer zurückgeben, während es auf seinen aynchronen Task wartet.
Im Fall des Page_Load
-Ereignisses wird dies, so denke ich, dann so aussehen, als ob es vollständig abgeschlossen ist. Wahrscheinlich wird der Seitenlebenszyklus seinen nächsten Schritt fortsetzen.
Der Grund für die Unterschiede ist, dass in Ihrem ersten Beispiel, obwohl es mit dem Lebenszyklus fortfahren wird, der Callback fast sofort erfolgt, so dass Response.Redirect
fast sofort ausgeführt wird, bevor der Rest der Seite eine Chance hat, irgendetwas zu tun .
Im Fall des zweiten haben Sie diese Verzögerung von 1000 und während dieser Zeit wird die Seite weiter andere Dinge laufen lassen und erst wenn diese Verzögerung vorbei ist, wird das respone.redirect ausgelöst. Dies kann sein, nachdem eine Antwort (von einem Fehler) bereits ausgelöst wurde.
Also im Wesentlichen async
aktiviert await
, aber was await
hört sich an, als ob es etwas mehr ist, als Sie erwarten.
Tags und Links .net asp.net async-await redirect asynchronous