winform会不会因为界面控件过多而导致内存溢出?

winform会不会因为界面控件过多而导致内存溢出?,第1张

会。很久以前我也遇到过,解决方法就是winform一般不会做无限多的控件。尽量让控件重复使用。不要不断的生产新的控件,不然占用内厅搏存还是很多的。当然也有可能是你代码的问题。还是尽量不要使用那么多控件,从设计的逗伏宽角度来山亮说,界面应该尽量简洁。

说明存续存在内存泄露,

断点调试看看是不是死循环导致的.

采用WeakReference

我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的。我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?.NET中提供了WeakReference来实现。弱引用可以让您保持对对象的引用,同时允许GC在必要时释放对象,回收内存。对于那些创建便宜但耗费大量内存的对象,即希望保持该对象,又要在应旦搏用程模做祥序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用。弱引用使用起来很简单,看下面的代码:

Object obj = new Object()

WeakReference wref = new WeakReference( obj )

obj = null

第一行代码新建了一个新的对象,这里叫它对象A,obj是对对象A的强引用。接着第二行代码胡型新建了一个弱引用对象,参数就是对象A的强引用,第三行代码释放掉对对象A的强引用。这时如果GC进行回收,对象A就会被回收。

怎样在取得对象A的强引用呢?很简单,请看代码2:

Object obj2 = wref.Target

if( obj2 != null )

{

// 做你想做的事吧。

}

else

{

// 对象已经被回收,如果要用必须新建一个。

}

只要显示的将弱引用的Target属性附值就会得到弱引用所代表对象的一个强引用。不过在使用对象之前要对其可用性进行检查,因为它可能已经被回收了。如 果你得到的是null(VB.NET下为Nothing),表明对象已经被回收,不能再用了,需要重新分配一个。如果不是null,就可以放心大胆的用 了。

这样写肯定不行啊,.NET的异常机笑饥制一般碰兄返只用于.NET体系之中,很多系统级别的crash .NET无法拦截的,而且就算能拦截此时应用已经无法运行了,你说你的catch能执行吗?

最好的做法是自己设置一个阀值,检测当数据足够大时进行释放,而不是依靠catch。而且尘和try catch这个东西正常情况下时不影响性能的,一旦执行catch会额外消耗性能。所以不要依赖try catch去帮你容错。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8247211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存