在WPF中调试未处理的异常。

16 浏览
0 Comments

在WPF中调试未处理的异常。

我有一个复杂的WPF应用程序,用于某种PA系统。它会定期显示视频,有时会播放音乐和不同的文本消息。

结构非常直观。有一个服务器有两个方法。SetMessage("String")和GetMessage("String")。

客户端每5秒通过WCF上的HTTP绑定连接到服务器,并调用GetMessage()。管理应用程序连接到服务器并调用SetMessage()。

在App.xml.cs中,我有一个处理CurrentDomain_UnhandledException、OnDispatcherUnhandledException、TaskScheduler.UnobservedTaskException和application.Current.DispatcherUnhnandledException的处理程序。所有这些处理程序都应该记录日志并继续操作。

应用程序中有一个页面使用Media元素播放短视频。有时在播放视频后,我的应用程序崩溃。

事件类型:clr20r3
P1:Client.exe
P2:0.0.2.0
P3:5226863e
P3:mscorlib
P5:4.0.0.0
P6:4ba1da6f
P7:219
P8:10
P9:system.invalidoperaionexception

现在这很好。但问题是:

  1. 尽管有4个不同的异常处理程序,我仍然收到异常。
  2. 我无法在客户端计算机上进行调试。
  3. 错误是随机的,但发生在我播放视频之后。
  4. 停止和开始视频的代码在Dispatcher.Invoke(new Action)中。
  5. 在停止视频之前,我可能只是离开该页面并切换到另一个页面。

看起来我只是在违反某个访问权限,并尝试从另一个线程更改代码中的某些内容。

有趣的是,我尝试使用ILDasm查找P7:219,但代码中没有这个。

有没有办法捕获这个该死的异常?

(实际上,我花了大约30分钟在这里寻找任何类似的问题,但所有的解决方案都已应用在我的代码中)

谢谢帮助。

0
0 Comments

问题出现的原因是在WPF中未处理的异常没有被正确地调度到主UI线程上,可能是因为在某个新的线程上启动了一个带有自己的调度器的线程。解决方法是编写代码来处理后台线程上的异常,并将这些异常调度到主UI线程上,然后在主UI线程上重新抛出异常以触发DispatcherUnhandledException事件。

在这个问题中,即使实现了所有的异常处理程序,也无法在具有自己调度器的线程上捕获异常。

还有自己的主要问题是找不到跟踪堆栈,但在事件日志中找到了它。作者解释说,问题出现的原因是自己对线程的处理不当,过多地使用了线程池。

希望这些信息能对你有所帮助。

0
0 Comments

原因:无法调试WPF中未处理的异常。

解决方法:通过检查Windows日志中的堆栈跟踪来解决问题。

0