createWindowEx失败异常

时间:2012-09-03 08:20:23

标签: c# winforms dll

我的服务器在.net C#windowsforms中使用createWindowEx dll抛出了

overbyteICS失败的异常。

我有一台服务器,可以全天处理大量客户端。但是当总连接数(即连接和断开连接数)达到10000时,出现上述错误,服务器停止接受用户连接并挂起机器。

2 个答案:

答案 0 :(得分:1)

我同意Roger,但请先确认一下 - 发生此错误时,请从开始菜单中的MicrosoftVisualStudio \ Tools运行SPY++,然后查看窗口树。展开分支并查找某些窗口的重复项。肯定会有很多,但你感兴趣的是数百和数千份。如果你达到了这个目标,那么罗杰所说的......并且除了周期性地重新启动连接服务器进程(或整个机器,以防万一)之外几乎没有解决方案确定它没有挂起(当然,服务器重启会激怒用户差不多......),或者修复/修补/重新实现连接服务器进程以便更加资源友好..

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

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

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

但是,我仍然认为这是最后一次重新开始,因为当连接数再次上升时问题将会恢复。首先,尝试ping服务器开发人员以永久修复它。

答案 1 :(得分: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,Processes选项卡可以看到的内容。选择View + Select Columns并勾选USER对象。同时勾选GDI对象和句柄,以及其他具有配额的资源。

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