於黾 2022-07-18 07:55 采纳率: 33.3%
浏览 60
已结题

C# winform 使用Region过多导致报错,什么原因?

问题遇到的现象和发生背景

做了大量的自定义控件,因为想要真正的透明效果,所以每个控件都会制定this.Region限制绘图区域

问题相关代码,请勿粘贴截图

using(GraphicsPath gp=new GraphicsPath(FillMode.Alternate))
{
//省略填充gp的代码
Region r=new Region(gp);
this.Region=r;
}

运行结果及报错内容

因为我有很多窗体,一开始不报错,当加载窗体多到一定程度就开始报错
this.Region=r;这一句代码报错
错误信息:GDI+中发生一般性错误,错误代码0x80004005,
通过代码获取到win32错误代码是0x591,不知道是什么东西溢出了
注意:不是内存泄漏
如果是内存泄漏,那么跟同时打开的窗体数量应该是无关的,而只跟内存占用有关
内存占用并不高
而且只要把窗体彻底关闭,那么即使反复打开也不会报错
但是只要同时打开的窗体数量多到一定程度(也就是使用region的控件的实例多到一定程度),就会崩溃
另:如果不是VS下执行,而是copy到别的地方执行,崩溃时报错的信息是内存不足,但是在任务管理器中观察不到内存占用有明显变化
窗体都是预先加载好的,已经实例化,但是没有show
只实例化不show就不会引发报错
同时show的窗体超过8个就会报错

我的解答思路和尝试过的方法

1.在执行this.Region=r;之前,先执行this.Region.Dispose();但所有控件的透明效果都消失了
2.在执行this.Region=r;之后,执行r.Dispose();结果所有调用控件的窗口全报错了,感觉Region变成null了
3.在new r之前,判断r如果不为空,先执行r.Dispose(),但依然报错。

我想要达到的结果

是整个程序集内的Region有数量限制吗,能调大吗?
到底啥原因,咋解决?

  • 写回答

3条回答 默认 最新

  • 「已注销」 2022-07-18 08:48
    关注

    单个大小控制在5G以内

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月22日
  • 修改了问题 7月18日
  • 修改了问题 7月18日
  • 创建了问题 7月18日

悬赏问题

  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?