前言:
c#編寫的winform程序,客戶端日誌報如下錯誤
異常信息:
System.Reflection.TargetInvocationException:Exception has been thrown by
the target of an invocation —>System.ComponentModel.Win32Exception:當前程序已使用了Windows管理器對象的系統允許的所有句柄。
異常分析:
-
程序將句柄池的可用句柄使用完畢,沒有新的可用句柄可以分配。換句話說,程序編碼有問題,使用完畢的對象沒有及時釋放,一直佔用系統資源。
-
msdn對GDI對象數量的描述,可以設置256-65536,win2000又做了特別說明,可以設置256-16384
-
msdn對用戶對象數量的描述,可以設置爲200-18000
-
看下客戶端系統的設置項,發現設置的是10000
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
- 在任務管理器監控進程詳情,如下圖,短短十幾次操作,GDI就飆升到9900+,直到10000,程序直接報錯。
解決辦法:
根據代碼,將部分使用完畢未釋放的對象進行了資源釋放;處理了幾個全局變量,修改爲局部變量。經過處理,用戶對象,GDI對象穩定在1500+。
參考鏈接:CreateWindowEx failed (當前程序已使用了 Window 管理器對象的系統允許的所有句柄。)
MSDN:User Objects&GDI Objects