私はWebFormsで非同期をテストしていましたが、私の質問は何かをする方法ではなく、すでに動作しているものがうまくいくかどうかということです。これは私のテストコードです:WebFormsのAsync/Await - ページのライフサイクルが終了する前に継続をどのように実行しますか?
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());
}
私のタスクはちょっと一時停止し、結果を書き出します。私の質問は - コントロールがOnLoadCompleteメソッドから生成されているため、これが動作するとは思っていません。ページが実際にレンダリングを終了し、クライアントが返される前にクライアントに返されると思います。
実際の出力は次のようになります。
OnLoadComplete
OnPreRender
1OnPreRenderComplete
だから、OnPreRenderを実行し、OnLoadCompleteに戻って制御できるようにOnLoadComplete方法は、コントロールをもたらしたことは明らかです。私の期待される結果は、 "1"は決して印刷されませんでした。これは、後続のイベントが発生し、応答が送信された後にページのスレッドが強制終了されるか、ポストタスクの書き込みが発生するためです。私は、上記を考えれば、たとえ10秒間遅れても、結果はまったく同じであることは驚くことではないと思います。
WebFormエンジンには、ページのライフサイクルの次の段階が進む前に待ち時間が完了することを保証する配線があると仮定します。誰がこれがどう起こるかを知っていますか?私は、継続が遅すぎることを恐れて他のイベントよりも前に完了する必要があるメソッドで非同期/待機を使用することを恐れていますが、内部的に処理される場合は心配しません。