我定义了两个WinForm,第一个Form(名字为form1)上有一个按钮,唯一的功能就是弹出form2,在form2中的装载事件(Form_Load)中声明了一个有1000行记录的DataTable,然后将该DataTable绑定到form2的一个DataGrid上.
可是我发现,从form1打开form2,再关闭form2后增加的内存并没有因为form2的关闭而释放,请问这是为什么?
可是我发现,从form1打开form2,再关闭form2后增加的内存并没有因为form2的关闭而释放,请问这是为什么?
{
f.ShowDialog();
}
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);//ShowWindow(this.Handle,6);使用这个倒的确是可以把内存释放,但我总不能在操作一段时间后就将窗体最小化吧,多莫名其妙呀
有没有更好一点的解决方法?
使用这个方法和不使用这个方法,我用例子测试过,没有明显的效果,郁闷
你用Form1调用Form2,然后是想在Form2界面下直接关闭这个程序还是想退回到Form1下再关闭这个程序?
如果是后者的话,我也遇到过。
我是这么解决的。
form1
{
button
{
Form2 newForm = new Form2();
Form1.hide();
this.showDialog(this);
Form1.show();
}
}Form2
{
this.close();}
没在我自己的机器上,记不太清了,不过应该没有问题。
打开Form1,假定程序占用内存为1,600K
通过Form1上的按钮,打开Form2,此时内存为11,600K
关闭Form2,此时的内存仍为11,600K,即便我在关闭事件(Closing)里面写上了this.Dispose,仍是一样的结果
哎,难道CSDN真的没有高手?
哎,难道CSDN真的没有高手?
哎,难道CSDN真的没有高手?
{
/*对窗体控件进行 *.close(); 操作
GC.SuppressFinalize(this);
}这函数运行于你的Form2关闭的时候, 作用是要Form2不进入垃圾回收! 直接释放其空间! 希望能帮到你!
第一次收集后把对象放到终止列表中.
第二次收集才会调用对象的Finalize() 释放内存.所以用下面的方法:GC.Collect();//强制对所有代进行垃圾回收
GC.WaitForPendingFinalizers();//挂起当前线程,直到处理完成器队列的线程清空该队列为止。
GC.Collect();//强制对所有代进行垃圾回收理论上用这种方法可以释放所有的垃圾
{
DataTable tbl = (DataTable)this.dataGrid1.DataSource;
tbl.Dispose();
tbl = null;
this.Dispose();
}Form1中调用Form2窗体的按钮事件:
private void button1_Click(object sender, System.EventArgs e)
{
using (Form2 f = new Form2())
{
f.ShowDialog();
f.Dispose();
}
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
没有任何反应,内存在Form2关闭后没有改变
{
DataTable tbl = (DataTable)this.dataGrid1.DataSource;
tbl.Dispose();
tbl = null;
this.Dispose();
}Form1中调用Form2窗体的按钮事件:
private void button1_Click(object sender, System.EventArgs e)
{
using (Form2 f = new Form2())
{
f.ShowDialog();
f.Dispose();
}
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
没有任何反应,内存在Form2关闭后没有改变---------------------------------------------------你再打开form2,再关闭,再打开,再关闭,看是不是还是在不停增加?我虽然没试过,但是我估计最多打开2次后就不会再增加内存量了
for( int i=0; i< 1000; i++ )
al.add( new Form2() );
由于内存不被释放,内存占用量会直线上升。
再试一下for( int i=0; i< 1000; i++ )
{
using (Form2 f = new Form2())
{
f.ShowDialog();
f.Dispose();
}GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}内存上升到一个值后就不会再长了,因为回收后的内存会被不停的分配
我之前编过一个程序!不知道怎么回事,在运行编译的exe后,我关闭了exe程序.但其程序并没有彻底的关闭,而是存在系统的进程中.真不搞不懂了.到底是怎么了?在这也请各位指点下.