2012-09-03 280 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

相關問題