处理在辅助线程进程中发生的未处理错误

时间:2009-03-09 15:21:14

标签: c# asp.net multithreading error-handling response.redirect

我有一个asp.net 2.0网络应用程序,它调用一个长时间运行的存储过程(约3分钟)。 sp实际上在后端执行许多任务。

我的页面使用线程和ajax(更新面板)和计时器控件来显示用户的progess栏。这一切都很有效,除非sp中的一个错误只是冻结了屏幕。

我尝试使用我在codeProject上找到的SafeThread类,它包装了线程进程并创建了一个可以在异常的情况下处理的事件。

在事件处理程序中,我只想将用户重定向到错误页面并显示错误。在测试时我可以在事件处理程序中中断。但是,调用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 个答案:

答案 0 :(得分:1)

处理请求时只能使用Server.Transfer()/ Response.Redirect() - 当你的thrd_ThreadException()被调用时不是这种情况。

尝试在thrd_ThreadException中设置一个标志,并在Timer1 Tick事件中进行重定向。