ASP.Net WebForms - 如何在使用异步代码时缓解线程中止异常 + Response.Redirect

ASP.Net WebForms - how to mitigate Thread Aborted exception when using async code + Response.Redirect

我正在开发一个较旧的 ASP.Net Web 窗体应用程序。我希望引入异步代码来帮助实现它的现代化。然而却遇到了僵局。

应用程序在母版页中使用 Response.Redirect(true) 在执行检查用户是否登录等操作时结束会话。这会结束响应并将用户重定向回登录页面。

问题出在页面上使用异步代码的时候。例如:

 protected async void Page_Load(object sender, EventArgs e)
        {
            await _userService.GetUser();

            if (!IsPostBack)
            {
                ...
            }
        }

在母版页中点击重定向时页面爆炸:System.Threading.ThreadAbortException:线程被中止。

我从这个问题中了解到为什么会发生这种情况:Why Response.Redirect causes System.Threading.ThreadAbortException? 但我不确定如何解决这个问题。我想在页面中使用异步代码,并允许 Response.Redirect 结束响应而不处理其余代码。

我尝试使用:

Response.Redirect(url, false);
Context.ApplicationInstance.CompleteRequest();

但是页面继续执行。在 WebForms 上有什么办法可以解决这个问题吗?或者我需要恢复到非异步代码吗?似乎没有像 MVC 中那样的方法 return RedirectToAction 停止页面执行?

据我了解,异步支持似乎可用于 WebForms - 其他项目如何解决此类问题?特别是在我们需要停止页面执行的场景中(例如,如果用户已注销?)

好吧,既然那个代码调用是 运行 然后开始做自己的事情?

那么当然该代码不能更新页面,因为页面将呈现,并被发送到客户端。

一般来说,您的代码隐藏等不及了。

所以,在 Web 表单之外启动该过程 - 毕竟,异步代码与页面没有任何关系,对吧?由于该页面将长时间呈现并向下发送到浏览器端,而该代码将关闭并且 运行s 并执行它应该执行的任何操作,对吧?当然代码不能等待,你不能阻止页面被发送到浏览器,因为如果你这样做,那么你的代码就不再异步了,是吗?????

所以,这样做:

{
Thread mypthread = new Thread(_userService.GetUser(););
mypthread.Start();
}

毕竟,该例程与当前页面无关,当前页面不能等待,因为如果它等待,那么该页面将被暂停,直到所有处理完成,然后再进行跳转到浏览器端。

所以,你不能阻止或阻止往返。

Page post back - browser travels up to server.
Code behind runs, new page is rendered, maybe code behind changes things on that page.

Page travels down back to browser and is now just sitting there.

那么,如果您要启动一些您不想等待的其他例程?当然,只需在所有重要往返之外的新线程中启动它。但是你当然不能触发一些异步代码,而是等待它完成,然后让页面继续呈现。如前所述,这样做会破坏异步代码的全部目的。