2012-09-03 247 views
1

createWindowEx失败的异常是由我的服务器引发的,它使用的是.net C#windowsforms中的overbyteICS dll。createWindowEx失败异常

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

+3

听起来像您的图书馆每个连接都使用一个隐藏的窗口。 Windows相对比较昂贵,所以当你创建数千个窗口时,你可能会认为'CreateWindowEx'开始失败。 –

+0

那么有没有解决方案? – Nikki

+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

但尽管如此,我认为,作为最后的restort,当连接的数量再次上升的问题将返回。首先,尝试ping服务器开发人员以永久修复该问题。

+0

我可以以某种方式增加到10000到20000? – Nikki

+1

如果你确实遇到_that_问题,那么很难。IIRC,Windows的最大数量是硬编码的限制,但正如我所说的,除非你使用的是非常旧的Windows版本,它已经很高了。您可以尝试运行SPY ++并检查其他**程序生成的窗口,然后关闭它们以释放更多的句柄,但是,您可能很难手动查找并关闭接下来的10000个窗口:)您可以配置OS在启动时运行更少的服务和程序来减少处理计数。 – quetzalcoatl

+0

注意:更正:它是在旧系统中硬编码的,现在看来它可以配置一点。看到我的编辑回答 – quetzalcoatl

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选项卡看到的东西。选择视图+选择列并勾选USER对象。同时勾选GDI对象和句柄,以及其他具有配额的资源。

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

+0

是的,我们是对的,我与任务管理器关于USER对象进行了检查,发现在每个连接上,用户对象都会增加,但在断开连接时不会减少。当用户对象达到10000时,我的服务器停止接受连接。所以如果可能的话,请为我提供解决问题的解决方案。在断开连接事件时,我正在处理客户端对象,并由GC在定时器上运行收集。 – Nikki

+0

这是彻头彻尾的泄漏。如果你确定你使用的是正确的DLL,那么你需要得到它的所有者的支持来修复这个bug。 –

+0

我无法从业主那得到这方面的支持,是不是有其他方法或工具来防止这种情况发生? – Nikki

相关问题