Ho testato async in WebForms e, per una volta, la mia domanda non riguarda come fare qualcosa, ma come funziona qualcosa che funziona già, funziona. Questo è il mio codice di prova:Async/Await in WebForms - In che modo viene eseguita la continuazione prima del termine del ciclo di vita della pagina?
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());
}
Quindi il mio compito si ferma per un po 'e poi scrive il risultato. La mia domanda è - non mi aspetto che funzioni perché il controllo è stato restituito dal metodo OnLoadComplete - mi aspetto che la pagina finisca effettivamente il rendering e che venga restituita al client prima che il mio compito venga restituito.
L'uscita effettiva è:
OnLoadComplete
OnPreRender
1OnPreRenderComplete
Quindi è chiaro che il metodo OnLoadComplete prodotto controllo in modo che OnPreRender poteva correre e quindi il controllo restituito al OnLoadComplete. Il mio risultato atteso era che il "1" non avrebbe mai stampato perché gli eventi successivi avrebbero sparato e il thread della pagina sarebbe stato ucciso o la scrittura post-attività sarebbe avvenuta dopo che la risposta fosse stata inviata. Immagino, visto quanto detto sopra, non sorprende che anche se indugio per 10 secondi, il risultato è esattamente lo stesso.
Suppongo che ci sia del cablaggio nel motore WebForm che assicura che tutte le attese siano completate prima che la fase successiva del ciclo di vita della pagina sia proseguita. Qualcuno sa per certo come succede? Ho paura di usare async/attendi nei metodi che devono essere completati prima degli altri eventi per timore che la continuazione sia troppo tardi, ma se è gestita internamente, allora non mi preoccuperò.