私はWebFormsで非同期をテストしてきましたが、私の質問は、何かを行う方法ではなく、すでに機能しているものがどのように機能するかについてです。これは私のテストコードです:
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
したがって、OnLoadCompleteメソッドが制御を生成して、OnPreRenderを実行し、制御をOnLoadCompleteに戻すことができることは明らかです。私の予想した結果は、後続のイベントが発生し、ページのスレッドが強制終了されるか、応答が送信された後にタスク後の書き込みが発生するため、「1」が出力されないことでした。上記のことを考えると、10秒間遅らせても、結果がまったく同じであることは驚くことではないと思います。
WebFormエンジンには、ページのライフサイクルの次のフェーズが進む前に、待機可能なものがすべて完了することを保証する配線があると思います。誰かがこれがどのように起こるかを確かに知っていますか?継続が遅すぎることを恐れて、他のイベントの前に完了する必要があるメソッドでasync / awaitを使用することを恐れていますが、それが内部で処理される場合は心配しません。