ASP.NET 4.5 async-await und Response.Redirect

8

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?!

    
JakubRi 29.10.2012, 16:07
quelle

2 Antworten

2

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 :

%Vor%

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.

    
JakubRi 02.11.2012, 15:46
quelle
1

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.

    
Chris 30.10.2012 11:39
quelle