Обработка необработанных ошибок, возникающих во вторичном поточном процессе - PullRequest
0 голосов
/ 09 марта 2009

У меня есть веб-приложение asp.net 2.0, которое вызывает долго работающий хранимый процесс (около 3 минут). SP фактически выполняет много задач на бэкэнде.

Моя страница использует многопоточность и ajax (панель обновления) и элемент управления таймером, чтобы отображать полосу прогей для пользователя. Это все прекрасно работает, если только в sp нет ошибки, которая просто зависает на экране.

Я пытался использовать класс SafeThread, который я нашел в codeProject , который оборачивает процесс потока и создает событие, которое может быть обработано в случае исключения.

В обработчике событий я просто хочу перенаправить пользователя на страницу ошибки и отобразить ошибку. При тестировании я могу взломать обработчик событий. Однако вызов Server.Transfer или Response.Redirect вообще не имеет никакого эффекта.

Я не уверен, почему это происходит. Я опубликую свой код ниже. Любые идеи или альтернативные предложения приветствуются.

    protected void btnSave_OnClick(object sender, EventArgs e)
    {
        DAC dac = new DAC();
        Session["RerunStatus"] = 0;
        SafeThread thrd = new SafeThread(new ParameterizedThreadStart(dac.RerunTest));
        thrd.IsBackground = true;

        //tell the SafeThread to report 
        //ThreadAbort exceptions
        thrd.ShouldReportThreadAbort = true;
        //attach a ThreadException handler for 
        //reporting SafeThread exceptions
        thrd.ThreadException += new
        ThreadThrewExceptionHandler(thrd_ThreadException);

        thrd.Start(ddlRundate.SelectedItem.Text);
        Session["RerunThread"] = thrd;
        btnSave.Enabled = false;
        Timer1.Enabled = true;
    }

    void thrd_ThreadException(SafeThread thrd, Exception ex)
    {
        //thrd.Abort();
        Timer1.Enabled = false;
        //Response.Redirect("ErrorPage.aspx");
        Server.Transfer("ErrorPage.aspx?ErrorMsg=" + ex.Message);
        //thrd.Abort();
    }

1 Ответ

1 голос
/ 09 марта 2009

Вы можете использовать только Server.Transfer () / Response.Redirect () при обработке запроса - это не тот случай, когда вызывается ваш thrd_ThreadException ().

Попробуйте установить флаг в вашем thrd_ThreadException и выполнить перенаправление в событии Timer1 Tick.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...