我有一个 WPF 应用程序,它有一个BackgroundWorker
. 我在这个 BGW 中抛出了一个异常,但它没有显示在任何地方!只是后台工作人员触发了它的WorkerFinished
事件。
它要去哪里?
我有一个 WPF 应用程序,它有一个BackgroundWorker
. 我在这个 BGW 中抛出了一个异常,但它没有显示在任何地方!只是后台工作人员触发了它的WorkerFinished
事件。
它要去哪里?
每个线程都有自己的调用栈;异常只能向上移动它们自己的调用堆栈,它们无法“渗入”另一个线程的调用堆栈。
当您的异常冒泡到触发DoWork
事件处理程序的 BackgroundWorker 的代码时,异常最终将被显式捕获并存储在Error
属性中,而不是让它到达调用堆栈的顶部并使应用程序崩溃。
如果您希望程序在 BGW 抛出异常时结束,那么您需要处理已完成的事件,检查异常,然后重新抛出它或抛出新的异常。
看这里,有一个很好的例子。RunWorkercompleted 中抛出的异常
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();