Поток прерывался, когда мы используем

Я получаю следующее исключение:

System.Threading.ThreadAbortException: поток был прерван.
в System.Threading.Thread.AbortInternal() в System.Threading.Thread.Abort(Object stateInfo) в System.Web.HttpResponse.End() в System.Web.HttpResponse.Redirect(String url, Boolean endResponse)
в System.Web.HttpResponse.Redirect(String url) в taxi_selection.lnkbtnconfirm_Click (Отправитель объекта, EventArgs e)

Я обнаружил, что решение для этого заключается в использовании:

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

но опять эта ошибка происходит.

Что является хорошим решением для этого?

мои фрагменты кода:

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

как вы можете видеть здесь, проблема заключается в том, что вы пытаетесь использовать response.redirect в блоке try/catch. Это исключение.

Ваше решение об изменении вызова Response.Redirect(url, false) должно работать. Вам нужно убедиться, что вы делаете это на каждом вызове Response.Redirect.

Также обратите внимание, что это продолжит выполнение, поэтому вам придется обработать это (чтобы оно не продолжалось каким-то другим способом).

Ответ 2

Это способ, которым Redirect работает, когда вы не позволяете продолжить работу остальной части страницы. Его остановите поток и сгенерируйте исключение прерывания. Вы можете просто проигнорировать это как:

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

}

Внимание

Если вы вызываете перенаправление без остановки остальной части обработки, хак, который может остановить процесс перенаправления с помощью плагина, такого как NoRedirect, может увидеть остальную часть страницы.!

Чтобы доказать свою точку зрения, я задаю вопрос о: перенаправлении на страницу с endResponse для истинного VS CompleteRequest и потока безопасности

Ответ 3

Response.Redirect без указания параметра endResponse как false (по умолчанию true) вызовет Response.End() внутренне и, следовательно, вызовет ThreadAbortException, чтобы остановить выполнение.

Здесь рекомендуется одна из двух вещей:

  • Если вам нужно закончить ответ, не делайте этого в try/catch. Это приведет к сбою перенаправления.

  • Если вам не нужно заканчивать ответ, вызовите это вместо:

    Response.Redirect(url, false);

Внутри 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
}

Чтобы избежать обработки обратной передачи и рендеринга HTML, вам нужно сделать больше:

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