1

createWindowEx failed exception is thrown by my server which is using overbyteICS dll in .net C# windowsforms.

I have a server which handles large number of clients throughout the day. But when the total connections(i.e Connection and disconnections altogether) count reaches to 10000 the above error appears and the server stops accepting user connections and also hangs the machine.

4

2 回答 2

1

你诊断得很好。是的,一个 CreateWindowEx() 失败和 10,000 个属于一起。10,000 是进程的默认 user32 对象配额。也就是说,单个进程不能创建超过 10,000 个窗口。这是针对泄漏窗口句柄的应用程序的对策,这是一个非常常见的错误。可以在会话中创建的窗口总数是有限的资源,让一个进程全部使用它们会导致彻底失败,您无法再关闭 Windows。

显然,在您的情况下,这不是泄漏。您可以通过更改注册表设置 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERProcessHandleQuota 来临时缓解。重新启动以使其生效。

如果机器不运行需要大量窗口的进程,从 10,000 增加到最大值 18,000 应该没问题。您可以使用 Taskmgr.exe,“进程”选项卡看到的内容。选择 View + Select Columns 并勾选 USER objects。在您使用 GDI 对象和句柄时,还要勾选其他具有配额的资源。

从长远来看,这种行为不能很好地扩展。您需要找到为每个 Web 请求创建窗口句柄的代码并修复它。

于 2012-09-03T12:44:03.807 回答
1

我同意 Roger 的观点,但让我们先确认一下 - 发生此错误时,SPY++从开始菜单中的 MicrosoftVisualStudio\Tools 运行并查看窗口树。展开分支并查找某些窗口的重复项。当然会有很多,但你对成百上千的副本感兴趣。如果你做到了,那么这就是罗杰所说的............除了定期重新启动连接服务器进程(或整个机器,以防万一)之外,几乎没有其他解决方案只是为了确保它不会挂起(当然,服务器重新启动几乎会激怒用户..),或修复/修补/重新实现连接服务器进程以更加资源友好..

请注意,虽然每个连接打开一个隐藏窗口是一种非常浪费的方法,但它仍然不应该挂机。它只是应该删除它无法处理的连接。在这里,它似乎根本没有实施任何限制,这是一个错误。

编辑:在 NT 之前(即 win9x)上,限制是硬编码的。在 NT 类系统上,您可以尝试调整池:

http://weblogs.asp.net/israelio/archive/2007/02/07/max-num-of-open-windows-under-xp-2003-vista-resolved.aspx

但是,我仍然认为这是最后一次恢复,因为当连接数再次增加时,问题会再次出现。首先,尝试 ping 服务器开发人员以永久修复该问题。

于 2012-09-03T08:45:28.557 回答