gpt4 book ai didi

ASP.NET 4.5异步等待和Response.Redirect

转载 作者:行者123 更新时间:2023-12-04 04:31:15 25 4
gpt4 key购买 nike

使用Page_Load-async时,是否有任何方法可以从await(或任何其他ASP.NET事件)重定向?当然Redirect会抛出ThreadAbortException,但是即使我用try-catch捕获了它,它最终也会出现错误页面。如果我调用Response("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关键字(因此Task在后台运行并且该方法继续),其结果也相同。唯一有用的是删除 async关键字-我以为 async仅启用 await,仅此而已?

最佳答案

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

我已经在我的基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事件(=在生命周期中不会继续)。

关于ASP.NET 4.5异步等待和Response.Redirect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13125361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com