1

我们的 WinForm 之一在 Form.Show 上给出了以下异常。表单的不透明度设置为 1%。我们观察到,如果我们将不透明度设置为 100%,错误就会消失。当机器(不是应用程序)长时间运行而没有重新启动时,通常会出现错误,通常在 2 天后。

异常详情如下:

System.ComponentModel.Win32Exception: Not enough storage is available to process this command
   at System.Windows.Forms.Form.UpdateLayered()
   at System.Windows.Forms.Form.OnHandleCreated(EventArgs e)
   at System.Windows.Forms.Control.WmCreate(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmCreate(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
MessageNot enough storage is available to process this command
StackTrace   at System.Windows.Forms.Form.UpdateLayered()
   at System.Windows.Forms.Form.OnHandleCreated(EventArgs e)
   at System.Windows.Forms.Control.WmCreate(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmCreate(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)SourceSystem.W indows.Forms
4

1 回答 1

9

System.ComponentModel.Win32Exception:没有足够的存储空间来处理此命令

这是一个非常低级的 Windows 错误,通常表明内核内存池已耗尽。这通常并不表明托管代码是问题的根源,尽管在 Winforms 应用程序中泄漏窗口句柄永远很容易。首先检查,运行 Taskmgr.exe,切换到进程选项卡。查看 + 选择列并勾选句柄、用户对象和 GDI 对象。在程序运行时观察这些列。特别是如果 USER 对象只是不断攀升,那么您的代码就有可能触发此异常的错误。到目前为止,泄漏窗口句柄的最典型方法是使用 Controls.Clear() 或 Controls.Remove() 并忘记在您删除的控件上调用 Dispose() 方法。那些被移除的控件只会堆积在隐藏的“停车窗口”上,永远不会被释放。

如果这没有成功,那么您正在查看您的机器的问题。视频驱动程序最有可能是问题的根源。它大量涉及 TransparencyKey 和 Opacity 属性,它是实现效果的视频适配器。如果您的程序立即因此异常而不是仅在运行一段时间后就被炸毁,那肯定是领先指标。从问题中并不清楚。寻找驱动程序更新是合乎逻辑的下一步。

于 2013-06-12T11:02:42.233 回答