Thread was being aborted when we use

2020-06-09 03:13发布

问题:

I'm getting the following exception:

System.Threading.ThreadAbortException: Thread was being aborted.
at System.Threading.Thread.AbortInternal() at System.Threading.Thread.Abort(Object stateInfo) at System.Web.HttpResponse.End() at System.Web.HttpResponse.Redirect(String url, Boolean endResponse)
at System.Web.HttpResponse.Redirect(String url) at taxi_selection.lnkbtnconfirm_Click(Object sender, EventArgs e)

I found that the solution for this is to use:

Response.Redirect("home.aspx",false);

but again this error is occurring.

What is a good solution for this?

my code snippets :

try
{
    Decimal Amount = 0;
    Int64 CabId = 0;
    String CabName = "";
    String CarImage = "";

    foreach (DataListItem gr in dtlstcars.Items)
    {
        RadioButton objcheck = (RadioButton)gr.FindControl("rdbtncarchecked");
        if (objcheck.Checked == true)
        {
            Literal ltrid = new Literal();
            ltrid = (Literal)gr.FindControl("ltrid");

            Label lbtaxiname = (Label)gr.FindControl("lbtaxiname");
            Label lbonewaycarprice = (Label)gr.FindControl("lbonewaycarprice");
            Label lbtwowaycarprice = (Label)gr.FindControl("lbtwowaycarprice");
            Image imgcar = (Image)gr.FindControl("imgcar");

            if (ltrid != null && lbtaxiname != null && imgcar != null && lbonewaycarprice != null && lbtwowaycarprice != null)
            {
                if (lbrootype.Text == "One")
                {
                    Amount = Convert.ToDecimal(lbonewaycarprice.Text);
                }
                else
                {
                    Amount = Convert.ToDecimal(lbtwowaycarprice.Text);
                }
            }
            CabId = Convert.ToInt64(ltrid.Text);
            CabName = lbtaxiname.Text;
            CarImage = imgcar.ImageUrl;
        }
   }
   if (lbroottype.Text != String.Empty && lbrouteid.Text != String.Empty && lbfrom.Text != String.Empty && lbpickupdate.Text != String.Empty && lbto.Text != String.Empty && lbpickupdate.Text != String.Empty && lbpickuptime.Text != String.Empty)
   { 
        Session.Add("BookingDetail", BookingDetail(lbroottype.Text, Convert.ToInt64(lbrouteid.Text), lbfrom.Text, lbto.Text, Convert.ToDateTime(lbpickupdate.Text), lbpickuptime.Text, Convert.ToDateTime(lbreturndate.Text), String.Empty, CabId, CabName, CarImage, Amount, txtPickupaddress.Text, txtDropaddress.Text, txtlandmark.Text, txtname.Text, ddmobilestdcode.SelectedValue, txtmobileno.Text, ddalternatestdcode.SelectedValue, txtalternateno.Text, txtemail.Text, lbdays.Text));//3
       Session.Remove("cart");
       Session.Remove("editcart");
       Response.Redirect("confirm");
   }
   else
   {
       Response.Redirect("home");
   }
}
catch (Exception ext)
{
    String msg = ext.Message;
    da.InsertRecordWithQuery("insert error_tbl values('" + msg + "')");
}

回答1:

http://support.microsoft.com/kb/312629

as you can see here the problem is that you are attempting to use response.redirect in a try/catch block. It thrown an exception.

Your solution of changing the call to be Response.Redirect(url, false) should work. You need to make sure to do it on every Response.Redirect call.

Also note that this will continue execution, so you will have to handle that (prevent it from continuing in some other way).



回答2:

This is the way the Redirect works when you do not let the rest of the page continue to run. Its stop the thread and throw that abort exception. You can simple ignore it as:

try
{
    Response.Redirect("newpage.aspx", true);
}
catch (System.Threading.ThreadAbortException)
{
    // ignore it
}
catch (Exception x)
{

}

Attention

If you call the redirect with out stopping the rest of the processing, a hack that can stop the redirect process using a plugin like the NoRedirect can see your rest of the page .!

To prove my point here I make a question about : Redirect to a page with endResponse to true VS CompleteRequest and security thread



回答3:

Response.Redirect without specifying the endResponse parameter as false (default is true) will call Response.End() internally and therefore will trigger a ThreadAbortException to stop execution.

One of two things are recommended here:

  1. If you need to end the response, do not do it in a try/catch. This will cause the redirect to fail.

  2. If you do not need to end the response, call this instead:

    Response.Redirect(url, false);

Within try/catch:

try {
    // do something that can throw an exception
    Response.Redirect(url, false);
    HttpContext.Current.ApplicationInstance.CompleteRequest();
} catch (SomeSpecificException ex) {
    // Do something with the caught exception
}

To avoid postback handling and HTML rendering, you need to do more:

http://web.archive.org/web/20101224113858/http://www.c6software.com/codesolutions/dotnet/threadabortexception.aspx



标签: c# asp.net