c#當前程序已使用了Windows管理器對象的系統允許的所有句柄

前言:
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章