"Win32Exception Not enough storage is available to process this command" 当 运行 作为 windows 服务时出错

"Win32Exception Not enough storage is available to process this command" error when run as a windows service

有时我会收到错误

Win32Exception Not enough storage is available to process this command

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

这对应于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)

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

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

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

是的,问题可能与服务器上的内存泄漏有关。也许 desktop heap 已耗尽。 "non-interactive" window 会话的桌面堆不同于真实(交互式)桌面会话的桌面堆。这解释了为什么仍然可以双击该应用程序。

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

The third SharedSection value (512) is the size of the desktop heap for each desktop that is associated with a "non-interactive" window station.

如果这解决了您的问题,例如由泄漏资源引起的堆耗尽可能是问题的根源。 "non-interactive" 桌面堆的大小默认比标准堆小得多。