“作为Windows服务运行时,”Win32Exception没有足够的存储可用于处理此命令“错误

时间:2015-03-07 22:03:58

标签: c# .net win32exception

有时我会收到错误

  

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

申请运行约一个月左右后。

这对应于system error

ERROR_NOT_ENOUGH_MEMORY (8)

通常,它作为Windows服务运行,并且更改其登录的用户仍然会发生错误。但是,如果我通过双击它来运行应用程序,它可以正常工作。它可以再次作为Windows服务运行的唯一方法是重新启动服务器。

该错误出现在应用程序写入的日志中。完整的错误是:

System.ComponentModel.Win32Exception: Not enough storage is available to process this command
   at System.Windows.Forms.NativeWindow.WindowClass.RegisterClass()
   at System.Windows.Forms.NativeWindow.WindowClass.Create(String className, Int32 classStyle)
   at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
   at System.Windows.Forms.Control.CreateHandle()
   at System.Windows.Forms.Application.MarshalingControl..ctor()
   at System.Windows.Forms.Application.ThreadContext.get_MarshalingControl()
   at System.Windows.Forms.WindowsFormsSynchronizationContext..ctor()
   at System.Windows.Forms.WindowsFormsSynchronizationContext.InstallIfNeeded()
   at System.Windows.Forms.Control..ctor(Boolean autoInstallSyncContext)
   at System.Windows.Forms.ScrollableControl..ctor()
   at System.Windows.Forms.ContainerControl..ctor()
   at System.Windows.Forms.Form..ctor()
   at LicensingModule.LicenseKeyValidator..ctor(String Name, String Path)
   at MIDICOMExporter.Program.Main(String[] args)

我看到其他答案说它与服务器上的内存泄漏有关,但是如果双击时应用程序仍然可以运行,那是否仍然意味着可能存在内存泄漏?

此外,这是在Windows Server 2012上运行。

2 个答案:

答案 0 :(得分:3)

移除类属性

Yes, the problem might be related to a memory leak on the server. Maybe the desktop heap已耗尽。 “非交互式”窗口会话的桌面堆与实际(交互式)桌面会话的桌面堆不同。这解释了为什么仍然可以双击应用程序。

尝试查找注册表项\ System \ CurrentControlSet \ Control \ Session Manager \ SubSystem,并按MSKB 126962(yyy)中所述增加SharedSection=xxx,yyy,zzz的第3个参数(zzz)。

  

第三个SharedSection值(512)是桌面堆的大小   对于与“非交互式”窗口关联的每个桌面   站。

如果这可以解决您的问题,例如由资源泄漏导致的堆耗尽可能是您的问题的根源。默认情况下,“非交互式”桌面堆的大小远小于标准堆。

答案 1 :(得分:0)

RegisterClass的调用导致内存错误。见Why RegisterClass fails with ERROR_NOT_ENOUGH_MEMORY?。您的应用多次拨打RegisterClassRegisterWindowsMessage