我有一个已经运行了10多年的WPF应用程序。我们最近开始在启动时在一些机器上的一些部署中遇到以下异常。主应用程序窗口将加载,它可以加载一些数据,但随后会被许多错误淹没。
System. InvalidOperationException:调度程序处理已挂起,但仍在处理邮件。在系统。Windows。穿线调度员WndProcHook(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,Boolean & handled)at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,Boolean & handled)at MS.Win32.HwndSubclass. DispatcherCallbackOperation(Object o)at System.Windows。穿线ExceptionWrapper。系统上的InternalRealCall(委托回调,对象参数,Int32 numArgs)。Windows。穿线ExceptionWrapper。TryCatchWhen(Object source,Delegate callback,Object args,Int32 numArgs,Delegate catchHandler)
就这样...这就是堆栈跟踪... *
首先,我基本上理解了这意味着什么,解决方案是使用Application.Current.Dispatcher.BeginInvoke()
来排队操作。事实上,MVVMLight有一个辅助函数DispatcherHelper.CheckBeginInvokeOnUI
,可以首先检查是否需要调度器。
然而问题是这个堆栈跟踪并没有显示任何用户代码,这意味着我必须考虑我在过去十年中编写的所有代码,并将MessageBox.Show('Hi 244')
放在我的代码中。如果有一个编码错误,我逃脱了它多年,从来没有在我的机器上。
这个问题通常发生在启动时,如果主窗口最终打开,那么程序似乎正常工作。
- 什么是应用:**
- . NET Framework 4.8/WPF/Windows 10 & 11
- 仓库/客户服务中使用的自定义运输软件。
- WPF/Xceed Data Grid/SmithHtmlEditor/MVVMLight
- 将Microsoft.Mshtml.DLL用于HTML
- 几年内无重大更新
- 在哪里?**
- 已部署的单击一次应用程序
- Windows 10和11
- . NET Framework 4.8.9166.0(来自RuntimeInformation. FrameworkDescription)
- 其他框架版本
- 带病毒防护和不带病毒防护的计算机
- 大多数在启动后不久,至少有十个错误
- 我的机器上都没有-)
- 错误处理/调试步骤:**
- 我在
Application_DispatcherUnhandledException
和TaskScheduler_UnobservedTaskException
上有一个处理程序,用于跟踪错误 - 分散我的代码与额外的
Application.Current.Dispatcher.VerifyAccess()
,但他们总是通过 - 当谷歌搜索这个错误-其他人得到了一个有用的堆栈跟踪!
我怀疑最近的Windows更新改变了一些东西,但由于唯一失败的机器是非开发机器,而且对我来说很遥远,诊断起来很棘手(缓慢)。
1条答案
按热度按时间uelo1irk1#
所以:
Release
模式下用Ctrl + F5
复制错误,但有相同的异常(和无用的堆栈跟踪)。Debug
模式,并没有错误!Debug
和Release
的所有设置,并尝试将Prefer 32-bit
更改为ON
(以匹配Debug)。突然间,一切都正常了,我的老板现在欣喜若狂,说他的机器从来没有运行得这么快过。
我仍然完全被难倒了,至于发生了什么,我真的很想更好地了解,如果有人知道,或可以建议额外的诊断或日志记录,我可以做。我想向微软报告这一点,但我没有复制。