【问题标题】:BackgroundWorker doesn't handle exceptionBackgroundWorker 不处理异常
【发布时间】:2012-08-15 13:45:09
【问题描述】:

我真的阅读过 Stackoverflow 上的所有其他类似主题。没有什么对我有用... 我抛出了“Exception”类型的异常,但我无法处理该异常。

我已经在 DoWork Progress 中的 CompletedEvent 中尝试过(使用 try/catch,witch e.error....)

void bgGetResponse_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        MessageBox.Show(e.Error.Message);
        ConvertByte(myFile);
        myFile= null;
    }
}

void bgGetResponse_DoWork(object sender, DoWorkEventArgs e)
{
    byte[] test= new byte[] { 1, 1, 0, 1, 1};
    //Here the error occured (just with  throw new Exception("error"))
    //The method only throws an exception (for test purposes)
    testResponse= _configManager.GetResponse(test, 0);
}

GetResponse(...)
{

   throw new Exception("..!");

}

有什么想法吗?

感谢您的努力

【问题讨论】:

  • 在 RunWorkerCompleted 中处理异常是可行的方法。我认为您的代码没有任何问题。请提供一个最小的工作示例项目。

标签: c# multithreading


【解决方案1】:

我通常只是在工作方法中捕获它并将结果设置给它。

private void BGW_DoWork(object sender, DoWorkEventArgs e)
{
    ...
}
catch (Exception ex)
{
    e.Result = ex;
}

然后查看 Completed 事件,

private void BGW_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.Cursor = Cursors.Default;

try
{
    Exception ex = e.Result as Exception;
    if (null != ex)
        throw ex;

...

【讨论】:

    【解决方案2】:

    如果“无法处理”异常是指不能使用catch,那是真的。您只需使用 Error 属性。您可以在 Completed 事件处理程序中“抛出”它;但是你的堆栈帧会有所不同。

    例如:

    try
    {
        if(e.Error != null) throw(e.Error)
        // handle success case
    }
    catch(MyException exception)
    {
        // handle specific error.
    }
    

    【讨论】:

    • 是的,我的意思是我无法捕捉到异常。 “您可以将其放入已完成的事件处理程序中,但是...”是什么意思?
    • @user1011394 添加了详细回答。
    • 感谢您的回复。我试过了。行为是相同的。我无法捕捉到异常......在调试模式(VS)中,调试器跳转到故障(抛出新异常(“..!”)),如果我运行 .exe 文件,应用程序就会崩溃。 ..
    • @user1011394 您必须提供更多详细信息,因为我提供的代码可以正常工作。也就是说,还有其他事情你没有详细说明,在我们知道那是什么之前,我们只能猜测(通常是错误的)。
    • 唯一的是,GetResponse() 位于项目中包含的 DLL 中。但是GetResponse()只有一行……“throw new Exception”……没有更多的细节信息,真的很奇怪
    【解决方案3】:

    BackgroundWorkers DoWork 函数中发生的任何未处理的异常都将导致工作人员触发 RunWorkerCompleted,其中事件参数将包含错误。

    【讨论】:

      猜你喜欢
      • 2012-05-05
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多