C# 程序报错:创建窗口句柄时出错

通过分析自己的程序,发现有两点原因导致:

一、
1.如出现同样的问题,可以考虑看下自己程序的自定义控件。

2.补充说明:
发现任务管理器-用户对象接近1W 会出现问题。

3.解决方法:
最终原因还是程序控件没有释放:遇到此问题,着重检查这种代码
//ctrl.Controls.Clear();
应改为:

while (ctrl.Controls.Count > 0)
{
Control ct = ctrl.Controls[0];
ctrl.Controls.Remove(ct);
ct.Dispose();
ct = null;
}

二、

上位机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对象数 趋于正常。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序街头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值