C# WPF:如果加载的事件中发生异常,应用程序不会崩溃

C# WPF:如果加载的事件中发生异常,应用程序不会崩溃,c#,wpf,exception,C#,Wpf,Exception,我已经创建了一个新的WPF应用程序,并为MainWindow中加载的事件添加了一个事件处理程序: Loaded += (s, e) => { throw new Exception("AAAA!"); }; 然后我从Visual C#启动这个应用程序,该应用程序既不会崩溃,也不会显示未捕获的异常 我预计它会崩溃,而这个应用程序确实会在其他计算机上崩溃。但是为什么它对我的有效呢 更新 添加了一个屏幕截图:加载的事件可能是从后台线程调用的。当在此线程中引发异常时,它将被终止,但不会影响主应用

我已经创建了一个新的WPF应用程序,并为MainWindow中加载的事件添加了一个事件处理程序:

Loaded += (s, e) => { throw new Exception("AAAA!"); };
然后我从Visual C#启动这个应用程序,该应用程序既不会崩溃,也不会显示未捕获的异常

我预计它会崩溃,而这个应用程序确实会在其他计算机上崩溃。但是为什么它对我的有效呢

更新
添加了一个屏幕截图:

加载的事件可能是从后台线程调用的。当在此线程中引发异常时,它将被终止,但不会影响主应用程序线程。这种行为可以在许多事件处理程序中看到,例如计时器事件处理程序通常也不会影响代码。
这并不意味着您不应该关心此类代码中的异常

要捕获异常,您需要在加载的方法中执行try/catch,或者可以告诉调度程序在发生未处理的异常时通知您

例如,在应用程序的OnStartup方法中尝试以下操作:

App.Current.DispatcherUnhandledException += (s,e) => 
{ 
  // Handle the exception here
  var ex = e.Exception; 
};
编辑:

如果希望应用程序崩溃,请尝试以下操作:

App.Current.DispatcherUnhandledException += (s,e) => 
{ 
  // this should cause your application to crash :-)
  throw new Exception("Now it should crash!", e.Exception);
};

这里的区别是,我们创建了一个新的异常,该异常在UI线程上抛出。

因为应用程序是为“任何CPU”编译的,而您运行的是64位操作系统?@Cody Gray它是为x86编译的,而我运行的是64位操作系统。将其更改为“任意CPU”,应用程序崩溃。有趣。啊,我玩了
Thread.Sleep
,现在如果它是为“任何CPU”编译的,它不会崩溃。是的,我知道。但是,当我没有DispatcherUnhandledException时,为什么我看不到标准的Windows对话框“应用程序已停止工作”?如果您希望应用程序崩溃,则必须在ui线程上引发异常。尝试在异常处理程序中引发新异常。@meze:用崩溃的版本更新了我的答案:-)@Rune Grimstad,更新了我的代码,应用程序没有崩溃。窗口保持显示状态,好像什么也没有发生。添加了
System.IO.File.writealText(“c:/ex”,“catch”)
,并创建了
c:/ex
。所以调用了
DispatcherUnhandledException
。@Rune Grimstad:是。如果我将它抛出
DispatcherUnhandledException
之外,应用程序将崩溃。但如果它在里面就不会了我怎么检查?在抛出异常之前,我添加了
Thread.Sleep(1000)
,整个窗口将挂起1秒。因此,我希望它们在同一个线程中。您可以尝试将thread.Current与this.Dispatcher.thread合并,以检测和/或检查this.Dispatcher.CheckAccess()的结果。但也许你不必,你想实现什么?(傅的回答和我上面的评论,似乎是同一条线索……)作为一名开发人员,如果我没有捕获所有异常,我希望我的应用程序崩溃。我不希望我的应用程序在出现故障时继续运行。我也不明白为什么加载的
会被另一个线程触发。我刚刚试过:
load+=(s,e)=>{if(this.Dispatcher.Thread.Equals(Thread.CurrentThread))Thread.Sleep(4000);抛出新异常(“AAAA!”);}。窗口冻结4秒,然后一切正常,没有“此应用程序已停止工作”对话框。哇,即使在UI线程上也会出现异常。。。这是否仅在从VS内部运行或直接启动时发生?我提供它与您的应用程序的比特度有关,请参阅以获取提示…感谢链接。答案中的解决方案适用于90%的情况,但似乎是因为64位计算机无法正确抛出异常。。