C# 程序报错:创建窗口句柄时出错
在一次做上位机Winform程序,需要用GDI技术画图形显示,当界面上增加很多 对象后,再添加时报错"创建窗口句柄时出错"
打开任务管理器,详细信息,添加列,将用户对象和GDI对象显示出来,发现 用户对象接近1W ,
问题原因:
GDI对象
Windows中将GDI对象和用户对象都限制为最大10000个,可以通过修改注册表来重新设置。
大概原因是 GDI非托管资源 未释放的原因。
解决方法:
1、起初通过抓Dump然后用WinDbg去分析,但是 其内存占用并不大,分析不出啥问题
2、直接从代码入手,一边操作一边看GDI对象的增加,看那个函数调用GDI对象数增加明显。
从添加一个设备的代码 一步步调试跟进,看调用哪个函数时 GDI对象/用户对象,增加的多。
发现一个类库项目中: new Form().CreateGraphics()每次调用都会加5个GDI对象,而这个函数会调用好多次,
于是设置一个静态变量:static Graphics = new Form().CreateGraphics();
修改后 测试发现GDI对象数 趋于正常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2021-06-10 Mac使用
2019-06-10 FTP与HTTP上传文件的对比
2019-06-10 【FTP】Wireshark学习FTP流程