於黾 2022-07-14 10:56 采纳率: 33.3%
浏览 53
已结题

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的控件的实例多到一定程度),就会崩溃

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

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

我想要达到的结果

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

  • 写回答

1条回答 默认 最新

  • xuzuning 2022-07-14 11:45
    关注

    GraphicsPath 和 Region 都是非托管资源

    评论

报告相同问题?

问题事件

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

悬赏问题

  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样