当前位置:编程学习 > C#/ASP.NET >>

C#写了一个程序,系统占用惊人,如何解决?

三个form,第一个是登陆Form1,Form1有4个TextBox,两个Button控件;
第二个是设置form2,Form2有十个TextBox,三个Button;一个Timer控件;
第三个运行form3,form3有一个WebBrower,一个listBox,十个Timer控件,由timer控制不断刷新载入新网页。
进入from1以后,new 一个Form2
Form2设置完成,new 一个Form3
Form3运行时,每隔10分钟走有Dispose WebBrower重新创建,释放内存。
然后每隔1小时,Form2 dispos掉Form3再重新new Form3继续运行。
就这样,程序运行一天一夜以后,系统TaskManage查看内存占用达到700M,系统异常缓慢,还出现死机,这是什么原因,如何才能解决?
--------------------编程问答-------------------- 没有必要反复的释放、重新创建对象。

你可以仔细研究下Singleton模式,Form、WebBrowser 可以考虑单例模式,只是隐藏、显示即可。不用Dispose 再 new 创建。
--------------------编程问答-------------------- 内存泄露,可能是不停的创建对象而没有销毁导致。 --------------------编程问答--------------------
引用 1 楼 builderc 的回复:
没有必要反复的释放、重新创建对象。

你可以仔细研究下Singleton模式,Form、WebBrowser 可以考虑单例模式,只是隐藏、显示即可。不用Dispose 再 new 创建。


up
--------------------编程问答-------------------- 不要动不动就说什么“内存泄漏”。假设我写了一个循环,申请了100万个冗余的结构而超出物理内存大小,这算内存泄漏么? --------------------编程问答--------------------
引用楼主 aninna 的回复:
三个form,第一个是登陆Form1,Form1有4个TextBox,两个Button控件;
第二个是设置form2,Form2有十个TextBox,三个Button;一个Timer控件;
第三个运行form3,form3有一个WebBrower,一个listBox,十个Timer控件,由timer控制不断刷新载入新网页。
进入from1以后,new 一个Form2
Form2设置完成,n……


谁跟你说过Dispose就是释放内存?

你那么多Dispose干什么呢? --------------------编程问答-------------------- 首先我感觉程序结构很乱,没必要搞出这么多form,那么多 timer. 更没必要反复释放form和创建form.
可以考虑包装control, 用 thread .
对象dispose 后, 最好 xxx = null, 这样能确保被gc捕获。
  --------------------编程问答--------------------
引用 1 楼 builderc 的回复:
没有必要反复的释放、重新创建对象。

你可以仔细研究下Singleton模式,Form、WebBrowser 可以考虑单例模式,只是隐藏、显示即可。不用Dispose 再 new 创建。

开始就是这样,因为第一、二个窗体之后根本不需要显示了,也无所谓隐藏显示,进入第三个窗体以后就在那里刷新WebBrower,但是内存太大,才disposeWebBrower,后来连同窗体一起dispose,好像还是吞噬内存,迷糊了。。。。 --------------------编程问答--------------------
引用 6 楼 builderc 的回复:
首先我感觉程序结构很乱,没必要搞出这么多form,那么多 timer. 更没必要反复释放form和创建form.
可以考虑包装control, 用 thread .
对象dispose 后, 最好 xxx = null, 这样能确保被gc捕获。

前两个窗体很简单,存在也应该不会影响很大,开始没有做第一、二个窗体照样吃内存,倒是=null没有做,这样才保险么? --------------------编程问答--------------------
引用 5 楼 sp1234 的回复:
引用楼主 aninna 的回复:
三个form,第一个是登陆Form1,Form1有4个TextBox,两个Button控件;
第二个是设置form2,Form2有十个TextBox,三个Button;一个Timer控件;
第三个运行form3,form3有一个WebBrower,一个listBox,十个Timer控件,由timer控制不断刷新载入新网页。
进入from1以后,new 一……

我的确认为dispose会释放内存,要怎么才确保资源会被释放? --------------------编程问答-------------------- 传说中的刷访问量的工具?

你直接在form2用form3.Close() 关掉就行了啊,没有必要专门去释放.
Close 方法默认会调用没有参数的 Dispose 方法 --------------------编程问答-------------------- 还有变量的申明位置也提些意见(你没有贴代码,我猜下)

while(true)
{
    sleep(10分钟);
    Form3 form3 = new Form3();//申明最好不放里边,不然又是崭新的一块地没了
    form3.Show();
}
改成
Form3 form3;
while(true)
{
    sleep(10分钟);
    form3 = new Form3();//重用应该能够减少消耗
    form3.Show();
}
--------------------编程问答--------------------
引用 11 楼 icdbow 的回复:
还有变量的申明位置也提些意见(你没有贴代码,我猜下)

while(true)
{
sleep(10分钟);
Form3 form3 = new Form3();//申明最好不放里边,不然又是崭新的一块地没了
form3.Show();
}
改成
Form3 form3;
while(true)
{
sleep(10分钟);
form3 = new Form3();//……


我是你提议这么做的 --------------------编程问答-------------------- 那就反过来,这样就保证释放彻底了


呵呵,多试试,明天早上再看看。 --------------------编程问答--------------------
引用 13 楼 icdbow 的回复:
那就反过来,这样就保证释放彻底了


呵呵,多试试,明天早上再看看。


你真狠,想折腾死我。。。。。 --------------------编程问答-------------------- 恩···建议楼主直接 窗体.close就得了。
然后明天再看看· 
做程序要多测试 --------------------编程问答-------------------- 手工调用GC.Collect()好了。 --------------------编程问答-------------------- Dispose
Nothing
GC.Collect()

这样还不行,就没什么办法了 --------------------编程问答-------------------- 为何要重复的创建WebBrowser?为何不在WebBrowser重复加载页面
另外:如果频繁的访问页面,为何不直接走http协议。 --------------------编程问答-------------------- 三星了,伴水,你马甲都三星了。仰望你。 --------------------编程问答-------------------- 你的程序占用内存过大,主要是因为使用过多timer空间。这控件相当占用内存。 --------------------编程问答-------------------- 你的问题主要出在程序结构不合理,要避免使用太多timer。释放内存用GC.Collect() --------------------编程问答-------------------- WebBrowser非托管资源
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,