6

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

它要去哪里?

4

2 回答 2

7

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

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

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

于 2013-05-17T16:17:57.217 回答
4

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

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();
于 2013-05-17T16:23:41.833 回答