在C#中如何釋放MDI子窗體內存???(200分)

  • 主题发起人 主题发起人 ing
  • 开始时间 开始时间
I

ing

Unregistered / Unconfirmed
GUEST, unregistred user!
問題如標題。要看到關閉時內存減少效果。
 
这个和 .NET框架 有关,因为你很难手动控制对象的关闭和知道对象的关闭时机,
期待高手的解答
 
垃圾收集器会自动去回收,不过你要最近去回收也可以。在关闭的时候调用GC.Collect();
 
用過看不到內存減少,反而增加。。。納悶[:(]
期待高人出現
 
難道真的的沒有辦法了嗎?
 
Form [] now= this.MdiChildren;
for (int i=0;
i< now.Length;
i++ )
{
now.Close();
now.Dispose();
}
应该由垃圾回收器自动收回的.
 
DJ6674
你的做法還是不行
我需要的即時看到內存減少,不然程序越來越慢,吃的內存越來越大。
 
使用Finalize方法
Finalize 方法允许对象在垃圾回收器自动回收对象的内存之前执行必要的清理操作
 
哪天看了楼主的问题,想到了用单例模式,问题是用了单例模式的话,整个MDI程序中相同的子窗体只能有一个,也就是说你的同一个MDI子窗体不管NEW多少次,一直是同一个,他的初始状态就是你上次做过修改后的保存状态,可不可以在你NEW了之后,的Load或者是Show事件中把你的状态设置为你需要的最初状态呢?我想可以。
这样的话,至少你的内存不会每NEW一次,内存就那么疯长了^-^,至于解决释放MDI的问题,我看是甭想了,没戏。
或者你试着在你关闭MDI的代码之后加上下面的代码看看,起不起作用了,上帝保佑^-^
GC.Collect();
GC.WaitForPendingFinlizers();
GC.Collect();
//***********************
如下是一位朋友实现MDI单例的代码,稍做修改就可以用了:
//***********************
其实这个问题,就是经典的23种设计模式中的单件模式(Singleton),下面用C#实现之:
首先我们有2个Windows Form,主窗体叫Form1,子窗体叫ChildForm。在主窗体中加入一Menu,用来实例化子窗体,我们在Form1.cs中写入下代码:
private static ChildForm childForm;
//静态变量,保存唯一实例
private void menuItem2_Click(object sender, System.EventArgs e)
{
ChildForm childForm = GetChildForm();
//获取子窗体对象
childForm.Show();
//显示之
}
private ChildForm GetChildForm()
{
//先后次序不能错,前一个条件用来判断是否是第一次,后一个条件用来判断子窗体是否被关闭了
if( childForm == null || childForm.IsDisposed )
{ //第一次实例化也好,被关了也好,都重新实例化
childForm = new ChildForm();
childForm.MdiParent = this;
}
return childForm;
}
//***********************
 
网事如风 謝謝你的回答
問題依然存在。內存還是不斷在膨脹,根本看不到減少。我的配置是P4 2.8 1G運行整個程序的時候內存膨脹到了70M然後不斷的在操作(包括開新窗口) 很容易的就膨脹到了160M甚至到達200多M...我用的是.net2003開發, 整個程序越用越慢。。。。。。我也用了單事例的方法了。如果我是用256內存的電腦就很少超過100M,難道微軟.NET就是吃不下的時候才吐出來嗎???好惡心。垃圾回收(GC)真的設計得那麼垃圾。。。。。。
 
如果需要手动控制, 即不停的建新窗体, 中间不停地关闭旧窗体, 可以考虑使用池的机制
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部