Ich habe async in WebForms getestet und ausnahmsweise geht es bei meiner Frage nicht darum, wie etwas zu tun ist, sondern darum, wie etwas, das bereits funktioniert, funktioniert. Das ist mein Testcode:Async/Warten auf WebForms - Wie läuft die Fortsetzung ab, bevor der Seitenlebenszyklus endet?
protected override void OnPreRender(EventArgs e)
{
Response.Write("OnPreRender<Br>");
}
protected override void OnPreRenderComplete(EventArgs e)
{
Response.Write("OnPreRenderComplete<Br>");
}
protected async override void OnLoadComplete(EventArgs e)
{
Response.Write("OnLoadComplete<br>");
var t1 = Task.Factory.StartNew(() => {
System.Threading.Thread.Sleep(2000);
return 1;
});
//This actually does run:
Response.Write((await t1).ToString());
}
Also meine Aufgabe pausiert für ein bisschen und dann schreibt das Ergebnis aus. Meine Frage ist - ich würde nicht erwarten, dass dies funktioniert, weil Kontrolle von der OnLoadComplete-Methode erhalten wurde - Ich würde erwarten, dass die Seite das Rendern tatsächlich beendet und an den Client zurückgegeben wird, bevor meine Aufgabe jemals zurückgegeben wird.
Die tatsächliche Ausgabe lautet:
OnLoadComplete
OnPreRender
1OnPreRenderComplete
es ist also klar, dass die OnLoadComplete Methode Kontrolle ergab, so dass OnPreRender laufen konnte und dann wieder die Steuerung an die OnLoadComplete. Mein erwartetes Ergebnis war, dass die "1" nie drucken würde, da die nachfolgenden Ereignisse ausgelöst würden und der Thread der Seite entweder gelöscht würde oder der Post-Task-Schreibvorgang nach dem Senden der Antwort stattfände. Ich denke, angesichts der obigen Ausführungen ist es nicht verwunderlich, dass, selbst wenn ich 10 Sekunden lang verzögere, das Ergebnis genau das gleiche ist.
Ich nehme an, es gibt eine Verkabelung in der WebForm-Engine, die sicherstellt, dass alle Wartezeiten abgeschlossen sind, bevor die nächste Phase des Lebenszyklus der Seite fortgesetzt wird. Weiß jemand genau wie das passiert? Ich habe Angst, async/await in Methoden zu verwenden, die vor anderen Ereignissen abgeschlossen werden müssen, aus Angst, dass die Fortsetzung zu spät sein wird, aber wenn es intern gehandhabt wird, dann mache ich mir keine Sorgen.