【问题标题】:BackgroundWorker crashes if reporting progress如果报告进度,BackgroundWorker 会崩溃
【发布时间】:2012-08-28 16:45:29
【问题描述】:

我有一个调用类中的方法的 BackgroundWorker。为该方法提供了对 BackgroundWorker 的引用,以便它可以报告其进度。这个伪代码显示了大纲:

void BackgroundWorker_DoWork( object sender )
{
    BackgroundWorker w = sender as BackgroundWorker;
    var c = new ProcessingClass()
    c.someMethod( w )
}

class ProcessingClass()
{
    someMethod( BackgroundWorker w )
    {
        w.ReportProgress(50)
        //calculations...
    }
}

问题是在报告进度后进行“计算”时,程序会崩溃。调试器跳转到启动“程序”类中的Application.Run( new frmMain() );,原因是“调用的目标已抛出异常。”

如果我不报告进度,一切正常。有谁知道为什么?我的猜测是这与线程有关,但我不知道如何。

【问题讨论】:

  • 你确定“w”不为空吗?
  • 我认为您需要显示计算代码。
  • 这可能是您的 ProgressChanged 事件处理程序中的错误。如果你清空它,它会起作用吗?此外,知道异常的类型和完整的堆栈跟踪肯定会有所帮助。
  • 请提供更多代码或内部异常详情
  • 您是否将 bw.WorkerReportsProgress 设置为 true?你有没有钩住事件处理程序?

标签: c# backgroundworker


【解决方案1】:

只是一些建议:

1.) 检查TargetInvocationException 异常的InnerException property

2.) 将 Visual Studio 配置为在抛出异常后立即停止:

这应该有助于更接近错误。

【讨论】:

  • 谢谢,这帮助我找到了确切的位置并解决了问题!这是解决方案:从我没有设置的 UserState 读取 ProgressChange,导致错误。
【解决方案2】:

也许您认为 ReportProgress 处于阻塞状态,并准备了 // calculations ... 中的代码所依赖的东西。并不是说它不是阻塞:

对 ReportProgress 方法的调用是异步的,并立即返回。

http://msdn.microsoft.com/en-us/library/ka89zff4.aspx

【讨论】:

  • 谢谢。我不知道这一点,但在这种情况下这不是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多