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# “如何调试”;存储空间不足,无法处理此命令;_C#_Wpf - Fatal编程技术网

C# “如何调试”;存储空间不足,无法处理此命令;

C# “如何调试”;存储空间不足,无法处理此命令;,c#,wpf,C#,Wpf,我们开始遇到没有足够的可用存储来处理此命令。应用程序为WPF,正常工作数小时后,异常开始弹出 System.ComponentModel.Win32Exception (0x80004005): Not enough storage is available to process this command at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d) at MS.Win32.HwndWrapper

我们开始遇到
没有足够的可用存储来处理此命令。应用程序为
WPF
,正常工作数小时后,异常开始弹出

System.ComponentModel.Win32Exception (0x80004005): Not enough storage is available to process this command
   at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
   at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
   at System.Windows.Interop.HwndSource.Initialize(HwndSourceParameters parameters)
   at System.Windows.Window.CreateSourceWindow(Boolean duringShow)
   at System.Windows.Window.CreateSourceWindowDuringShow()
   at System.Windows.Window.SafeCreateWindowDuringShow()
   at System.Windows.Window.ShowHelper(Object booleanBox)
   at System.Windows.Window.Show()
   at System.Windows.Window.ShowDialog()
我的理解是,这是某种内存不足异常,特定于
windows资源的分配。可能的原因是什么?我如何调试它


更新

我已经复习了@Thili77()建议的主题。我使用GDIView和taskmanager查看了应用程序执行过程中使用的句柄(taskmgr中的句柄、用户对象和GDI对象),看起来它们并没有增长。我的下一个测试是尝试在没有VS的情况下运行一天(以前它是在VS主机进程下运行的),并检查是否仍然发生这种情况。我仍在寻找任何建议或提示,如果有人有任何

更新#2 它发生在一台新的干净PC上,没有主机,而手柄、用户对象和GDI对象在崩溃期间都是正常的。当电脑处于崩溃状态时,任何东西都无法正常工作-看起来句柄确实泄漏了,但ProcMon不会显示这些值的大数字。同样奇怪的是,这种情况总是发生在晚上7-8点左右,那时办公室里没有人,我什么时候开始运行应用程序也无关紧要。这已经是第三次这样的撞车了。巧合我注意到的唯一一件奇怪的事情是该应用程序的大量页面错误,并且不断增加。这有关系吗?不再显示,请参见更新#3

更新#3

接下来是我经历的一次车祸的细节。系统是x86,应用程序是x86,w7sp1。 屏幕截图上显示的当前状态正好在崩溃之后,windbg暂停了该过程。 由于某些原因,现在异常有不同的消息:
操作已成功完成
。但它仍然是来自同一段代码的同一个Win32Exception

我还需要指出,我在运行时桌面堆的数量减少了,并且启用了AppAnalyzer基本选项,以便使故障更加频繁(这似乎有效)。时间假设确实是一个巧合,不再注意到与时间相关的共享主题。

看起来像是一个微软没有故意解决的问题,请检查,其中说明:

我们感谢您的反馈。然而,这个问题将不会在WPF的下一个版本中解决。非常感谢。 –WPF团队

提供了一种变通方法,它可能有助于:

您可以通过向线程进程添加以下代码来解决此错误:

Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
dispatcher.BeginInvokeShutdown(DispatcherPriority.Normal);
Dispatcher.Run();
这会要求与线程关联的调度程序立即关闭


一种可能是服务器的可用空间不足。表中有0x4000字符串原子的限制,分配给表的空间总量也有限制。窗口类是进入这个表的内容之一

我本人从未尝试过调试此类问题,但我确实找到了一篇关于使用WinDbg检查此问题的文章:。你可能想调查一下这可能的原因

如果这是罪魁祸首,一个可能的原因是应用程序没有关闭窗口实例。清除其Dispose中的全局原子,这是对WM_DESTROY的响应,这是对调用窗口(或设置)的响应,如果值更改,并且窗口是通过调用ShowDialog而不是Show显示的,则最终关闭窗口)。原子泄漏可能还有其他原因


另外,我怀疑这是因为“没有足够的存储空间来处理此命令”是RegisterClassEx无法添加到全局atom表时返回的错误。

根据我的经验,如果您的UI线程挂起,而其他线程继续向主应用程序UI dispatcher发送消息,我会收到这种类型的异常。因此,在类型的某个时段,消息队列已满,您将收到此异常


要进行调试,您可能需要在调试会话期间在VS中找到线程1(即UI)并监视其活动。也许在一些外部事件或其他事件中有一些无限服务员。

在投反对票之前,有人想表达一下自己的想法吗?我会帮你的。@Thili77谢谢。不知何故,我忽略了这个话题,因为你提到了一天中的某个特定时间,这是一个特殊的公司网络,将集团政策推送到所有PC机上吗?“新的干净PC”是同一网络的一部分,还是发生在一台孤立的PC上?根据描述,耗尽的内核内存池将是最合乎逻辑的原因。不是你的程序必然导致的那种问题。谷歌“windows诊断内核内存池耗尽”相关点击。谢谢你的建议。看起来这不是问题所在-我已经检查了已使用句柄的数量,但它们没有增长。我们还有一个普通的WPF应用程序,只有一个STA线程。他会在任务管理器中看到这一点,用户对象计数器会很高。而且它不能破坏整个操作系统的稳定。@Alex,你能检查一下这个类似的问题吗?不幸的是,我有另一个项目的最后期限,所以我不得不推迟我的调查,所以我现在不能检查。但这绝对是迄今为止我得到的最好的答案,如此慷慨