WPF 和 Windows 10 崩溃
Posted
技术标签:
【中文标题】WPF 和 Windows 10 崩溃【英文标题】:WPF and Windows 10 crash 【发布时间】:2017-03-14 11:17:18 【问题描述】:我们有一个 WPF 应用程序需要在不同的用户登录和注销各自的 PC 时保持较长时间(一夜之间)打开。
[更新] WPF 应用程序从这里使用单实例技术:http://blogs.microsoft.co.il/blogs/arik/SingleInstance.cs.txt
单实例功能不是导致该错误的原因
只有在以下情况下才会发生奇怪的崩溃:
操作系统为 Windows 10
以下用户登录/注销顺序必须发生:
帐户 A 正在启动应用程序并注销或锁定 PC。 B账户在夜间登录,在PC上工作一段时间,然后注销。 帐户 A 早上再次登录。应用程序运行,但 UI 被冻结/最小化。单击/尝试调整大小时,出现以下错误:
System.OutOfMemoryException: Insufficient memory to continue the execution of the program.
at System.Windows.Media.Composition.DUCE.Channel.SyncFlush()
at System.Windows.Interop.HwndTarget.UpdateWindowSettings(Boolean enableRenderTarget, Nullable`1 channelSet)
at System.Windows.Interop.HwndTarget.UpdateWindowPos(IntPtr lParam)
at System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Interop.HwndSource.HwndTargetFilterMessage(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.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
我已经查看了这些帖子
win32 window in WPF https://social.msdn.microsoft.com/Forums/vstudio/en-US/a29b9b58-376c-49b7-a6b7-fba6a510524a/wpf-and-windows-10-crash?forum=wpf http://www.actiprosoftware.com/community/thread/3849/minimize-navbar-floating-window-size-out-of-m我尝试了上述帖子中的建议,但没有成功。
另外,我无法始终如一地重现该问题。登录之间似乎需要一些时间才能出现问题。
感谢您提出的任何建议。
【问题讨论】:
WPF 使用不当可能会遇到此类内存问题,您必须从 Internet 学习最佳实践,以确保正确释放资源(尤其是与绑定相关的)。列出这些提示作为答案太宽泛了。您还可以学习如何分析内存不足的崩溃转储,这将显示泄漏的来源。 没什么可做的,但我会假设您在许多 GUI 上调用 New 或从未正确清除的大量资源。应用的本质是什么? 我认为与内存泄漏无关。仅当用户 A 再次登录后单击应用程序的窗口时才会发生崩溃。我让应用程序打开了几天,但什么也没发生(内存使用量也没有增加)。仅在登录注销序列的情况下并且仅在 Windows 10 上。该应用程序在 GUI 资源上非常轻量级。我发现如果我隐藏窗口并仅在用户 A 再次登录时恢复它,那么崩溃就不会再发生了。我希望我说得通。 我们排除了单实例功能是它的原因(它也发生在禁用该功能的情况下) 您解决了这个问题吗?我的猜测是您遇到了图形驱动程序问题。 【参考方案1】:似乎这是已知的 WPF 错误:https://github.com/dotnet/wpf/issues/439 2020 年 6 月 3 日还没有解决方案。
【讨论】:
【参考方案2】:System.Windows.Media.Composition.DUCE.Channel.SyncFlush() 中的 System.OutOfMemoryException 或 System.Runtime.InteropServices.COMException 通常是由 GDI 对象或用户对象泄漏引起的。
您可以在任务管理器中监控这些泄漏。为此选择“GDI 对象”或“用户对象”列。如果 GDI 对象计数超过限制(Windows 默认为 10000),您的应用程序中会出现 OutOfMemory 异常。
检查您的应用程序是否泄漏 System.Drawing 命名空间对象引用、您忘记销毁的图标句柄等...
有关详细信息,请参阅 https://blogs.msdn.microsoft.com/dsui_team/2013/11/18/wpf-render-thread-failures/
【讨论】:
以上是关于WPF 和 Windows 10 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何按应用程序名称过滤Windows事件查看器?(寻找我的c#/ wpf崩溃)
触摸键盘隐藏 UI 元素 [Windows 10 和 WPF]
Windows 8 运行时(WinRT/Windows 应用商店应用程序/Windows 10 通用应用程序)与 Silverlight 和 WPF 相比如何? [关闭]