Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Thread was being aborted when we use

Tags:

c#

asp.net

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 + "')");
}
like image 274
Kavita Avatar asked Feb 01 '13 05:02

Kavita


People also ask

What is thread being aborted?

If the thread that calls Abort holds a lock that the aborted thread requires, a deadlock can occur. If Abort is called on a thread that has not been started, the thread will abort when Start is called. If Abort is called on a thread that is blocked or is sleeping, the thread is interrupted and then aborted.

What is the exception that will be thrown if you try to start an aborted thread using start method?

In C#, a thread can be terminated using Abort() method. Abort() throws ThreadAbortException to the thread in which it called. Due to this exception, the thread is terminated.


3 Answers

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).

like image 143
AnthonyM Avatar answered Sep 20 '22 07:09

AnthonyM


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

like image 37
Aristos Avatar answered Sep 21 '22 07:09

Aristos


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

like image 30
Sumo Avatar answered Sep 18 '22 07:09

Sumo