在使用Response.Redirect()时遇到线程中止异常

27

我在一个Update Panel中编写了以下代码。

protected void myGrid_RowCommand(object sender, GridViewCommandEventArgs e)
{
    try
    {
        if (e.CommandName =="EditNames")
        {
            long lSelectedName = Convert.ToInt64(e.CommandArgument);
            Session["SelectedItem"] = lSelectedName;
            Response.Redirect("EditItem.aspx");
        }
        else if (e.CommandName =="DeleteNames")
        {
            long lSelectedName = Convert.ToInt64(e.CommandArgument);
            ValidName.DeleteItem(lSelectedName);

            ScriptManager.RegisterStartupScript(this, GetType(), "Key", "alert('Name deleted sucessfully')", true);
        }
    }
    catch (System.Threading.ThreadAbortException)
    {

    }
    catch (Exception ex)
    {
        Error handling code...
    }
}

我在重定向时遇到了“线程中止异常”。然而,通过使用错误处理程序 System.Threading.ThreadAbortException,我解决了这个问题。

但我不确定为什么在重定向时会出现这个错误。即使我解决了这个问题,我仍想知道我的编码方式是否有误或者是否有停止错误触发的方法。

请提供您的意见...

请注意,该页面位于 AJAX UPDATE PANEL 下面。


1
可能是[为什么Response.Redirect会导致System.Threading.ThreadAbortException?]的重复问题。(https://dev59.com/O3E85IYBdhLWcg3wbTD1) - Ryan Gates
5个回答

40

4
完成请求。 - Matt
1
这是更好的答案,因为它避免了首先出现异常。我希望几年前就知道这个! - Michael Silver
请确保将Context大写,因为它是Page.Context对象。虽然@Aheho的编辑出于善意,但是是不正确的。 - kaelle

25
尽管你已解决了这个问题,但你想知道你的编码方式是否有任何错误。
没有错误,你做得很好。
这个错误是可以预料的。当重定向时,服务器线程实际上被中止,因此会抛出此异常。来自MSDN文档的说明:
如果将endResponse参数设置为true,则此方法调用原始请求的End方法,在完成时引发ThreadAbortException异常。
还有你正在使用的重载的文档: 重定向调用End,完成时引发ThreadAbortException异常。

1
因此,使用 Response.redirect("Edititem.aspx",false) 可以避免出现线程中止异常。 - Sai Avinash
2
@Avinash,这确实避免了异常,但它也没有关闭响应,因此重定向无法发生,直到您自己调用End。在调用End时,异常仍将被抛出。 - Mike Perrenoud
4
如果你将 false 传入第二个重载函数,它不会自动调用 End。但是,在你调用该响应的 End 方法之前,所请求的重定向无法发生,因此当你自己调用 End 时,仍会出现异常。抛出异常的不是 Redirect 方法,而是 End 方法。 - Mike Perrenoud

3
这是因为你在try/catch块内重定向了。不要这样做。

0
Response.Redirect("Location", false);

没有"ThreadAbortException"的情况下,它可以正常工作。


0

在重定向方法中提到false就足够了,例如: Response.Redirect("TargetPage", false);


4
欢迎来到SO!虽然这是一个回答,但如果它能更详细地解释为什么行得通,那么你的帖子可能会更好,所以如果你能添加一些更多的信息,就会更有用。 - Mike Precup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接