【问题标题】:Why my exception is not making any difference in a wpf application?为什么我的例外对 wpf 应用程序没有任何影响?
【发布时间】:2013-05-12 21:27:44
【问题描述】:

我有一个具有BackgroundWorker 的 WPF 应用程序。我在这个 BGW 中抛出了一个异常,但它没有显示在任何地方!只是后台工作人员触发了它的 WorkerFinished 事件。

它要去哪里?

【问题讨论】:

  • 来自 BackgroundWorker 上的 MSDN 条目:“如果操作引发了您的代码无法处理的异常,BackgroundWorker 将捕获该异常并将其传递给 RunWorkerCompleted 事件处理程序,在该处理程序中它被公开为System.ComponentModel.RunWorkerCompletedEventArgs 的 Error 属性。"
  • 与 WPF 无关。给albahari.com/threading 读一读,这将是值得的时间!

标签: c# wpf exception-handling event-handling backgroundworker


【解决方案1】:

每个线程都有自己的调用栈;异常只能向上移动它们自己的调用堆栈,它们无法“流血”到另一个线程的调用堆栈中。

当您的异常冒泡到触发DoWork 事件处理程序的BackgroundWorker 代码时,异常最终将被显式捕获并存储在Error 属性中,而不是让它到达调用堆栈的顶部并崩溃应用程序。

如果您希望程序在 BGW 抛出异常时结束,那么您需要处理已完成的事件,检查异常,然后重新抛出它或抛出新的异常。

【讨论】:

  • 后台线程中的异常也会使应用程序崩溃,在这种情况下,BackgroundWorker 类被设计为在抛出异常时不会使应用程序崩溃。
【解决方案2】:

看这里,有一个很好的例子。 RunWorkercompleted 中抛出的异常

Unhandled exceptions in BackgroundWorker

var worker = new BackgroundWorker();
worker.DoWork += (sender, e) => 
    { 
        throw new InvalidOperationException("oh shiznit!"); 
    };
worker.RunWorkerCompleted += (sender, e) =>
    {
        if(e.Error != null)
        {
            MessageBox.Show("There was an error! " + e.Error.ToString());
        }
    };
worker.RunWorkerAsync();

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2020-03-07
    • 2013-01-18
    相关资源
    最近更新 更多