我的服务器在.net C#窗口窗体中使用overbyteICS动态链接库时抛出了createWindowEx失败异常。
我有一个服务器,可以全天处理大量的客户端。但是,当总连接数(即连接和断开连接总数)达到10000时,就会出现上述错误,服务器会停止接受用户连接,同时也会使机器挂起。
发布于 2012-09-03 16:45:29
我同意罗杰的观点,但让我们先确认一下-当这个错误发生时,从开始菜单中的MicrosoftVisualStudio\Tools运行SPY++并查看窗口树。展开分支并查找某些窗口的副本。当然会有很多这样的书,但你会对成百上千的副本感兴趣。如果你打中了,那就是罗杰说的..。...and除了定期重新启动连接服务器进程(或整个机器,以防万一)之外,几乎没有其他解决方案,只是为了确保连接服务器进程不会挂起(当然,服务器重新启动几乎同样会激怒用户..),或者修复/修补/重新实现连接服务器进程,以使其对资源更友好。
请注意,虽然为每个连接打开一个隐藏窗口是一种非常浪费的方法,但它仍然不会挂起机器。它应该简单地删除它无法处理的连接。在这里,它似乎没有实现任何限制,这是一个错误。
编辑:在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-03 20:44:04
你诊断得很好。是的,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的Processes选项卡中看到的内容。选择View + Select Columns并勾选USER objects。同时勾选GDI对象和句柄,以及其他有配额的资源。
从长远来看,这种行为不能很好地扩展。您需要找到为每个web请求创建窗口句柄的代码并修复它。
https://stackoverflow.com/questions/12244254
复制相似问题