1

我有一个复杂的 WPF 应用程序,用于某种 PA 系统。它不时显示视频,有时它会在屏幕上播放音乐和不同的短信。

结构非常简单。有一个服务器有 2 种方法。SetMessage("字符串"); 和 GetMessage("String");

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

在 App.xml.cs 中,我有 CurrentDomain_UnhandledException、OnDispatcherUnhandledException、TaskScheduler.UnobservedTaskException 和 application.Current.DispatcherUnhnandledException 的处理程序。他们都假设做nlog并继续操作。

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

EventType : 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 分钟,试图在这里找到任何类似的问题,但所有的解决方案都已经应用在我的代码中)

感谢您的帮助。

4

2 回答 2

1

我认为你在某个地方用它自己的调度程序开始一个新线程
请看看 msdn 在这个链接上给出的评论
http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception .aspx

对于在主 UI 线程上运行的代码未处理的每个异常,应用程序都会引发 DispatcherUnhandledException。如果在后台用户界面 (UI) 线程(具有自己的 Dispatcher 的线程)或后台工作线程(没有 Dispatcher 的线程)上未处理异常,则不会将异常转发到主 UI 线程。因此,不会引发 DispatcherUnhandledException。在这些情况下,您将需要编写代码来执行以下操作: 在后台线程上处理异常。将这些异常分派到主 UI 线程。在主 UI 线程上重新抛出它们而不处理它们以允许引发 DispatcherUnhandledException。

只是为了提供信息,即使您正在实现所有这些异常处理程序,您也无法使用它自己的调度程序捕获错误

希望这可以帮到你

于 2013-09-12T18:51:08.290 回答
0

毕竟这很容易。

我没有跟踪堆栈来找出问题所在。我尝试做 nlog、WER 和许多其他事情,但我没有得到真正的跟踪堆栈。

当我出于兴趣决定检查 Windows 日志时,发现在记录错误后 Windows 确实记录了堆栈跟踪!它让我可以在几秒钟内找到错误。

问题是在线程池中的工作中产生的异常。

于 2013-09-13T15:47:48.233 回答