0x88980406 SyncFlush()...有解决方法吗?

29

我的应用程序出现了这个异常。 我找到了一些讨论它的链接,但没有任何迹象表明如何找到它的源头和/或解决方法。

请不要回复互联网上的链接。 请提供跟踪源头的策略。 如果您找到了解决方法,请提供绕过方法。

Source: PresentationCore
Message: Exception from HRESULT: 0x88980406
Stack Trace:
   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 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

2
我认为这篇文章可能会有所帮助,被采纳的答案包含了一系列调试此问题的策略清单。https://dev59.com/q3I-5IYBdhLWcg3wQV8Z - invalidusername
2
有一篇非常好的MSDN博客深入描述了这个问题。简短的答案是没有单一的原因:https://blogs.msdn.microsoft.com/dsui_team/2013/11/18/wpf-render-thread-failures/. - RB.
3个回答

10

虽然这篇文章有点旧,但我还是会回答的,因为我刚刚解决了相同的问题。https://dev59.com/yHPYa4cB1Zd3GeqPj4Rk#18003004

基本上,我的问题出在过时的显卡驱动程序上。更新到最新的驱动程序后,问题得到了解决。


9
在我的情况下,问题应用程序已经接近其规定硬件的内存限制。每当我添加使用大量内存的代码时,这个问题就会出现。
当我实现一个将图像缓冲区处理放在另一个线程上的功能时,最终使用了一个MemoryFailPoint机制。

https://learn.microsoft.com/en-us/dotnet/api/system.runtime.memoryfailpoint

第一次实现解决了问题,但经过多次尝试,QA引起了OOM bomb。

因此,我使用了MemoryFailPoint()GC.Collect()循环(有点hackish...但有时候需要这样做)。

我学到的主要知识点是:

  1. 这是WPF中一个非常严重的bug。
  2. 只有在真正消耗了大量内存时才需要担心它。

我在一个用户的电脑上看到了相同的异常(仅在30台电脑中的一台!?)我既不理解问题的确切原因,也不知道解决方法。你能帮帮我吗?你能否发送一些代码,展示如何使用MemoryFailPoint,特别是如何强制垃圾回收器释放一些内存?谢谢。 - lot
此外,我不明白为什么我的应用程序会占用太多内存。在任务管理器中,它通常有大约50MB的RAM,而该计算机有2GB。我唯一能想到的是垃圾收集器已经损坏了。我的用户整天工作,不断地打开和关闭表单。虽然约两打用户运行得非常好,但这个特定的用户却遇到了OutOfMemory异常或原始主题中提到的特定异常。 - lot
抱歉 @lot,直到 StackExchange 给我发邮件我才看到你的评论。你可以尝试分析代码,找出可能持有对象引用的地方,这样 GC 就能够正常工作了。 - cbuteau
你可以调查是否可以迁移到不同版本的.NET。在我的情况下(过去),迁移到另一个版本的.NET是不可能的。我一直在使用4.5,在我的当前职位上完全没有看到这个问题(感谢上帝)。但这是一个bug。它要么与您正在使用的WPF框架和DirectX本身有关...要么与有问题的系统上的驱动程序有关。首先调查这些事情...祝好运。 - cbuteau

4

在微软的帮助下,我们终于解决了一个困扰我们超过一年的SyncFlush问题。原来我们在本地代码中创建了多媒体定时器,但每次没有释放。更具体地说,我们调用了timeBeginPeriod和timeEndPeriod函数,但begin被调用的次数比end多,导致资源泄漏。WPF渲染线程需要使用这些定时器,但我们用完了有限的数量(可能是65k),结果渲染线程停止渲染并卡死或崩溃了。要注意定时器的使用!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接