我一直在WebForms中测试异步,我的问题不是关于如何做某件事,而是关于如何工作的东西,是否工作。这是我的测试代码: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引擎中有一些接线,确保在页面生命周期的下一阶段进行之前完成任何等待。有谁知道这是怎么发生的?我害怕在需要在其他事件之前完成的方法中使用异步/等待,因为担心继续太迟了,但如果它在内部处理,那么我不会担心。