9

使用-时有什么方法可以从Page_Load(或任何其他 ASP.NET 事件)重定向?当然会抛出,但即使我抓住它-它最终会出现错误页面。如果我调用它不会崩溃,但我需要停止执行页面(渲染页面等),所以这不是解决方案。正如我注意到这两种方法的作用不同:asyncawaitRedirectThreadAbortExceptiontrycatchResponse("url", false)

这以 ThreadAbortException 结束(我假设任务同步结束):

protected async void Page_Load()
{
    await Task.Run(() => { });
    Response.Redirect("http://www.google.com/");
}

这个在 Response.Redirect 之后继续:

protected async void Page_Load()
{
    await Task.Delay(1000);
    Response.Redirect("http://www.google.com/");
}

我必须等待响应,但我正在试验,即使我删除了await关键字(所以任务在后台运行并且方法继续)它最终还是一样。唯一有帮助的是删除async关键字 - 我认为async只有启用await,仅此而已?!

4

2 回答 2

2

好的,我找到了如何处理的答案。

我在我的基 Page 类中创建了一个 Redirect 方法包装器:

protected void Redirect(string url)
{
    this.isRedirecting = true;

    Response.Redirect(url, false);

    if (Context.ApplicationInstance != null)
        Context.ApplicationInstance.CompleteRequest();
}

并覆盖RenderRaisePostBackEvent

protected override void Render(HtmlTextWriter writer)
{
    if (this.isRedirecting)
        return;
}

protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)
{
    if (!this.isRedirecting)
        base.RaisePostBackEvent(sourceControl, eventArgument);
}

这就是诀窍。在所有等待的任务完成之前, ASP.NET 4.5 不会触发PreRenderComplete事件(= 在生命周期中不会继续)。

于 2012-11-02T15:46:00.267 回答
1

免责声明:我没有使用过async/await但以下内容基于我对文档的阅读。

据我了解,只要您await在代码中有一个,它将异步调用提供的任务,并且该方法的其余部分实际上转换为回调方法。所以在这种情况下,因为Page_Load它在运行它时是异步的,并且它会在等待其异步任务完成时将控制权返回给调用者。

在这种情况下Page_Load,我认为,这将看起来好像它已经完成,所以页面生命周期将继续到下一步。

差异的原因是,在您的第一个示例中,尽管它会继续生命周期,但回调几乎是立即的,因此Response.Redirect在页面的其余部分有机会做任何事情之前几乎会立即运行。

在第二个的情况下,您有 1000 的延迟,并且在此期间页面将继续运行其他内容,并且只有当延迟结束时才会触发 respone.redirect。这可能是在响应(来自错误)已经被触发之后。

所以本质上async确实启用await了,但await听起来它比你预期的要多一点。

于 2012-10-30T11:39:03.660 回答