Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调试WPF中未处理的异常_C#_Wpf_Wcf_Video - Fatal编程技术网

C# 调试WPF中未处理的异常

C# 调试WPF中未处理的异常,c#,wpf,wcf,video,C#,Wpf,Wcf,Video,我有一个复杂的WPF应用程序,用于某种PA系统。它会不时播放视频,有时还会在屏幕上播放音乐和不同的文字信息 结构非常简单。有一个服务器有两种方法。设置消息(“字符串”);和GetMessage(“字符串”) 客户端每5秒钟通过WCF上的HTTP绑定连接到服务器一次,并提取GetMessage()。Admin应用程序连接到服务器并调用SetMessage() 在App.xml.cs中,我有CurrentDomain_UnhandledException、OnDispatcherUnhandledE

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

结构非常简单。有一个服务器有两种方法。设置消息(“字符串”);和GetMessage(“字符串”)

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

在App.xml.cs中,我有CurrentDomain_UnhandledException、OnDispatcherUnhandledException、TaskScheduler.UnobservedTaskeException和application.Current.DispatcherUnhandledException的处理程序。它们都假设进行nlog并继续运行

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

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
现在一切都好了。但问题是:

  • 尽管有4个不同的异常处理程序,但我仍然得到了异常
  • 我无法在客户端计算机上调试
  • 错误是随机的,但发生在我播放视频之后
  • 停止和启动视频的代码位于Dispatcher.Invoke(新操作)中
  • 在停止视频之前,我可能会离开页面,切换到另一个页面
  • 看起来我只是违反了一些访问权限,试图从另一个线程更改代码中的某些内容

    有趣的是,我试着做ILDasm,发现P7:219,但代码中没有

    有没有办法抓住那个奇怪的例外

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


    Thanx寻求帮助。

    我认为您正在某个地方使用自己的dispatcher启动一个新线程
    请查看msdn在此链接上给出的备注

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

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


    希望这能帮助您

    我认为您正在使用自己的dispatcher启动一个新线程
    请查看msdn在此链接上给出的备注

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

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


    希望这能帮助你

    毕竟这很容易

    我没有跟踪堆栈来解决问题。我试着去做nlog,WER和许多其他的事情,但我没有得到真正的跟踪堆栈

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


    在线程池中的工作中生成了异常问题

    毕竟这很容易

    我没有跟踪堆栈来解决问题。我试着去做nlog,WER和许多其他的事情,但我没有得到真正的跟踪堆栈

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


    在线程池中的工作中生成了异常问题

    在catch块的exception对象上,将引发异常的代码(可能在传递给调度程序的
    new Action
    中)包装为try/catch-and-call
    exception.ToString()
    。留着吧。把它转储到磁盘,随便什么。另外,请记住,跨越线程边界的异常会破坏整个应用程序。但是没有例外的细节。。。谁知道呢?是的,谢谢你,威尔。我试试看。但这就是问题所在,看起来我在两条线之间,实际上我无法说出发出声音的原因和地点。我真的不知道是哪个PEICE抛出了异常。你的第一步是跟踪那个异常对象。包装您怀疑与之一起抛出的任何代码。一旦获得了完整的异常详细信息(将从ToString()获得),并在此处添加信息。或者你可以找到你的解决方案。你没有崩溃转储吗?将引发异常的代码(可能在传递给调度程序的
    新操作中)包装在ca中异常对象的try/catch-and-call
    exception.ToString()