C# 为什么我的异常对wpf应用程序没有任何影响?
我有一个WPF应用程序,它有一个C# 为什么我的异常对wpf应用程序没有任何影响?,c#,wpf,exception-handling,event-handling,backgroundworker,C#,Wpf,Exception Handling,Event Handling,Backgroundworker,我有一个WPF应用程序,它有一个BackgroundWorker。我在这个BGW中抛出了一个异常,但它没有显示在任何地方!,只有后台工作进程触发其WorkerFinished事件 它要去哪里?每个线程都有自己的调用堆栈;异常只能向上移动它们自己的调用堆栈,它们无法“出血”到另一个线程的调用堆栈中 当异常冒泡到启动DoWork事件处理程序的BackgroundWorker代码时,异常将被显式捕获并存储在Error属性中,而不是允许它到达调用堆栈的顶部并使应用程序崩溃 如果希望程序在BGW引发异常时
BackgroundWorker
。我在这个BGW中抛出了一个异常,但它没有显示在任何地方!,只有后台工作进程触发其WorkerFinished
事件
它要去哪里?每个线程都有自己的调用堆栈;异常只能向上移动它们自己的调用堆栈,它们无法“出血”到另一个线程的调用堆栈中 当异常冒泡到启动
DoWork
事件处理程序的BackgroundWorker代码时,异常将被显式捕获并存储在Error
属性中,而不是允许它到达调用堆栈的顶部并使应用程序崩溃
如果希望程序在BGW引发异常时结束,则需要处理已完成的事件,检查异常,然后重新引发或引发新异常。看这里,有一个很好的示例。中的异常在RunWorkercompleted中大量出现
在
BackgroundWorker
上的MSDN条目中:“如果操作引发代码未处理的异常,BackgroundWorker将捕获该异常并将其传递到RunWorkerCompleted事件处理程序,在该处理程序中,该异常作为System.ComponentModel.RunWorkerCompletedEventArgs的错误属性公开。”与WPF无关。读一读,这是值得花的时间!后台线程中的异常也会使应用程序崩溃,在这种情况下,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();