2013-08-27 108 views
18

我在更新面板下的页面中编写了以下一段代码。在使用Response.Redirect时出现线程异常异常()

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。

但是,我不确定为什么这个错误来了,而ridirecting。即便如此,我解决了这个问题,我想知道有没有在我编码或过程中的任何错误,有没有什么办法阻止错误在所有

烧给你的输入...

需要注意的是,该页面正在AJAX更新面板

+1

可能重复的[为什么Response.Redirect导致System.Threading.ThreadAbortException?](http://stackoverflow.com/questions/2777105/why-response-redirect-causes-system-threading-threadabortexception) –

回答

20

虽然,我解决了这个问题,我想知道有没有在过程中的任何错误,我编码

没有错,你做得很好。

此错误是预期的。它被抛出是因为服务器线程实际上在重定向时被中止。来自MSDN documentation

如果您为endResponse参数指定了true,则此方法将调用原始请求的End方法,该方法在完成时引发ThreadAbortException异常。

,为overload you're using:

重定向文件调用结束其完成时抛出一个ThreadAbortException异常。

+0

因此,使用Response.redirect(“Edititem.aspx”,false)避免了线程中止异常 –

+2

@Avinash的发生,它确实避免了异常,但它也不会关闭响应,所以直到调用'自己结束。当调用'End'时,异常仍然会被抛出。 –

+4

如果您将'false'传入第二个重载,它将不会自动调用'End'。然而,直到你对该响应调用了'End',你所要求的重定向才会发生,所以当你自己调用'End'时,你仍然会得到异常。它不是抛出异常的'Redirect'方法,它是'End'方法。 –

15

请阅读这篇文章 - http://blogs.msdn.com/b/tmarq/archive/2009/06/25/correct-use-of-system-web-httpresponse-redirect.aspx

而是在结束请求的,它是通过调用Context.ApplicationInstance.CompleteRequest()绕过请求执行流水线一个很好的做法。

所以您的代码会是这个样子:

Response.Redirect("TargetPage", false);  //write redirect 
context.ApplicationInstance.CompleteRequest(); // end response 
+4

Context.ApplicationInstance.CompleteRequest(); – Matt

+1

这是更好的答案,因为它首先避免了例外。我希望我几年前就知道这件事! –

+0

确保Context是大写字母,因为它是Page.Context对象,@Aheho编辑的,虽然真诚,但是不正确。 – kaelle

0

这足以提重定向方法假像, 的Response.Redirect( “TargetPage”,假);

+4

欢迎来到SO!虽然这是一个答案,但它可能更有用,如果它有更多关于为什么会起作用的细节,那么如果添加更多信息,那么您的帖子可能会做得更好。 –

1

这是因为你在try catch内重定向。 你最好不要。