C# 不透明度=1%有时会出现Win32Exception:没有足够的存储空间来处理此命令

C# 不透明度=1%有时会出现Win32Exception:没有足够的存储空间来处理此命令,c#,.net,C#,.net,我们的一个WinForm在Form.Show上给出了以下异常。窗体的不透明度设置为1%。我们观察到,如果我们将“不透明度”设置为100%,错误将消失。当机器(不是应用程序)长时间运行而未重新启动时,通常会出现错误,通常是在2天后 例外情况详情如下: System.ComponentModel.Win32Exception: Not enough storage is available to process this command at System.Windows.Forms.Form

我们的一个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
System.ComponentModel.Win32Exception:存储空间不足,无法处理此命令

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

如果这还不能实现,那么您的机器就有问题了。视频驱动程序是最可能的问题源。它与TransparencyKey和Opacity属性密切相关,是视频适配器实现了这种效果。当然,如果你的程序在运行一段时间后立即爆炸,而不是在运行一段时间后爆炸,那么这是一个前导指示器。这个问题并不清楚。寻找驱动程序更新是合乎逻辑的下一步

System.ComponentModel.Win32Exception:存储空间不足,无法处理此命令

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


如果这还不能实现,那么您的机器就有问题了。视频驱动程序是最可能的问题源。它与TransparencyKey和Opacity属性密切相关,是视频适配器实现了这种效果。当然,如果你的程序在运行一段时间后立即爆炸,而不是在运行一段时间后爆炸,那么这是一个前导指示器。这个问题并不清楚。寻找驱动程序更新是合乎逻辑的下一步。

在我看来,真正的问题在于其他地方。如果您的应用程序在错误发生之前运行了很长时间,则可能是某些资源没有得到正确的处理。垃圾收集器很不错,但它不能独自解决所有问题。感谢ElmoVanKielmo的回复。根据观察,问题似乎只与不透明有关。当我们把它设为1%时,问题就出现了,当我们把它设为100%时,问题就消失了。你说的是1%和100%,你试过不同的值吗?因为我猜100%没有做任何事情,因为它是默认的…在我看来,真正的问题是在其他地方。如果您的应用程序在错误发生之前运行了很长时间,则可能是某些资源没有得到正确的处理。垃圾收集器很不错,但它不能独自解决所有问题。感谢ElmoVanKielmo的回复。根据观察,问题似乎只与不透明有关。当我们把它设为1%时,问题就出现了,当我们把它设为100%时,问题就消失了。你说的是1%和100%,你试过不同的值吗?因为我猜100%没有做任何事情,因为它是默认的…你好,汉斯·帕萨特,非常感谢你的回复。1.我们已经检查了用户对象,它们随着窗体关闭而增加和减少,因此这可能不是问题所在。2.当系统刚启动时,很少的初始运行不会出现问题。但它会在几个小时后启动,一旦启动,每次运行都会出现。这很可能是另一个占用内核内存空间的进程。没有为您的程序留下足够的空间来完成它需要做的事情。您需要仔细查看机器上运行的是什么。SysInternals的Process Explorer是一个非常好的实用工具,提供了深入的见解。你好,Hans Passat,非常感谢您的回复。1.我们已经检查了用户对象,它们随着窗体关闭而增加和减少,因此这可能不是问题所在。2.当系统刚启动时,很少的初始运行不会出现问题。但它会在几个小时后启动,一旦启动,每次运行都会出现。这很可能是另一个占用内核内存空间的进程。没有为您的程序留下足够的空间来完成它需要做的事情。您需要仔细查看机器上运行的是什么。SysInternals的Process Explorer是一个非常好的实用工具,提供了深入的见解。