如果反复不断的开关子窗体,那么内存使用就会不断增加
要怎么样才能把占用的内存释放出来呢?
14 个解决方案
#1
清空对象
#2
怎么清空?
我用了GC.Collect();也不见效果
我用了GC.Collect();也不见效果
#3
GC.COLLECT()不建议频繁使用.没有非托管的对象,会有这样情况?
一般内存泄露只会是多线程的锁操作一个变量没有上锁导致的.
一般内存泄露只会是多线程的锁操作一个变量没有上锁导致的.
#4
内存没有泄露,只是反复打开的时候,内存一直在增加
#5
打开一个就new一个对象?
#6
/// <summary>
/// 打开子窗体
/// </summary>
/// <param name="form"></param>
private void AddSubForm(Form form)
{
if (FindSubForm(form.Text)) return;
form.MdiParent = this;
form.WindowState = FormWindowState.Maximized;
form.Show();
}
/// <summary>
/// 查找子窗体
/// </summary>
/// <param name="caption"></param>
/// <returns></returns>
private bool FindSubForm(string caption)
{
foreach (Form frm in this.MdiChildren)
{
if (frm.Text == caption)
{
frm.WindowState = FormWindowState.Maximized;
frm.Activate();
return true;
}
}
return false;
}
我是这么写的
/// 打开子窗体
/// </summary>
/// <param name="form"></param>
private void AddSubForm(Form form)
{
if (FindSubForm(form.Text)) return;
form.MdiParent = this;
form.WindowState = FormWindowState.Maximized;
form.Show();
}
/// <summary>
/// 查找子窗体
/// </summary>
/// <param name="caption"></param>
/// <returns></returns>
private bool FindSubForm(string caption)
{
foreach (Form frm in this.MdiChildren)
{
if (frm.Text == caption)
{
frm.WindowState = FormWindowState.Maximized;
frm.Activate();
return true;
}
}
return false;
}
我是这么写的
#7
不会释放
打开时之创建一个实例
打开时之创建一个实例
#8
垃圾回收会去回收这些内存的,了解下垃圾回收的机制吧.这个没有问题的.
#9
#region MDI子窗体实例化一次
/// <summary>
/// 名称:CheckChildOpenState
/// 功能:用子窗体的Name进行判断是否已实例化,如果存在则将他激活
/// </summary>
/// <param name="MdiForm">容器窗体</param>
/// <param name="ChildForm">子窗体</param>
public static void CheckChildOpenState(Form MdiForm, Form ChildForm)
{
foreach (Form tempChildForm in MdiForm.MdiChildren)
{
if (tempChildForm.Name == ChildForm.Name.ToString())
{
if (tempChildForm.WindowState == FormWindowState.Minimized)
{
tempChildForm.WindowState = FormWindowState.Normal;
}
tempChildForm.Activate();
return;
}
}
ChildForm.MdiParent = MdiForm;
ChildForm.Show();
}
#endregion
最后关闭的时候,清理一下。this.Dispose()
/// <summary>
/// 名称:CheckChildOpenState
/// 功能:用子窗体的Name进行判断是否已实例化,如果存在则将他激活
/// </summary>
/// <param name="MdiForm">容器窗体</param>
/// <param name="ChildForm">子窗体</param>
public static void CheckChildOpenState(Form MdiForm, Form ChildForm)
{
foreach (Form tempChildForm in MdiForm.MdiChildren)
{
if (tempChildForm.Name == ChildForm.Name.ToString())
{
if (tempChildForm.WindowState == FormWindowState.Minimized)
{
tempChildForm.WindowState = FormWindowState.Normal;
}
tempChildForm.Activate();
return;
}
}
ChildForm.MdiParent = MdiForm;
ChildForm.Show();
}
#endregion
最后关闭的时候,清理一下。this.Dispose()
#10
我是想关子窗体的时候,就把子窗体的内存释放,用托管的,似乎一直在增加中
#11
窗口关闭的时候自动执行Form.Dispose() 方法,释放的是非托管资源。
GC.Collect()释放的才是托管资源
#12
Form.Close(),Form.Dispose(),GC.Collect()
上面的三个我全都用了,但是内存还是只增不少
上面的三个我全都用了,但是内存还是只增不少
#13
自已顶
#14
每次打开都会实例化一个对象,内存上都会增加这个事正常的呀。
只是垃圾回收的时候,可能第一次扫描,并不会去回收这些没有引用的对象,一些对象会经过多次回收才能回收掉的。
你可以反复的打开关闭,一段时间后再看看是什么情况呀。
只是垃圾回收的时候,可能第一次扫描,并不会去回收这些没有引用的对象,一些对象会经过多次回收才能回收掉的。
你可以反复的打开关闭,一段时间后再看看是什么情况呀。
#1
清空对象
#2
怎么清空?
我用了GC.Collect();也不见效果
我用了GC.Collect();也不见效果
#3
GC.COLLECT()不建议频繁使用.没有非托管的对象,会有这样情况?
一般内存泄露只会是多线程的锁操作一个变量没有上锁导致的.
一般内存泄露只会是多线程的锁操作一个变量没有上锁导致的.
#4
内存没有泄露,只是反复打开的时候,内存一直在增加
#5
打开一个就new一个对象?
#6
/// <summary>
/// 打开子窗体
/// </summary>
/// <param name="form"></param>
private void AddSubForm(Form form)
{
if (FindSubForm(form.Text)) return;
form.MdiParent = this;
form.WindowState = FormWindowState.Maximized;
form.Show();
}
/// <summary>
/// 查找子窗体
/// </summary>
/// <param name="caption"></param>
/// <returns></returns>
private bool FindSubForm(string caption)
{
foreach (Form frm in this.MdiChildren)
{
if (frm.Text == caption)
{
frm.WindowState = FormWindowState.Maximized;
frm.Activate();
return true;
}
}
return false;
}
我是这么写的
/// 打开子窗体
/// </summary>
/// <param name="form"></param>
private void AddSubForm(Form form)
{
if (FindSubForm(form.Text)) return;
form.MdiParent = this;
form.WindowState = FormWindowState.Maximized;
form.Show();
}
/// <summary>
/// 查找子窗体
/// </summary>
/// <param name="caption"></param>
/// <returns></returns>
private bool FindSubForm(string caption)
{
foreach (Form frm in this.MdiChildren)
{
if (frm.Text == caption)
{
frm.WindowState = FormWindowState.Maximized;
frm.Activate();
return true;
}
}
return false;
}
我是这么写的
#7
不会释放
打开时之创建一个实例
打开时之创建一个实例
#8
垃圾回收会去回收这些内存的,了解下垃圾回收的机制吧.这个没有问题的.
#9
#region MDI子窗体实例化一次
/// <summary>
/// 名称:CheckChildOpenState
/// 功能:用子窗体的Name进行判断是否已实例化,如果存在则将他激活
/// </summary>
/// <param name="MdiForm">容器窗体</param>
/// <param name="ChildForm">子窗体</param>
public static void CheckChildOpenState(Form MdiForm, Form ChildForm)
{
foreach (Form tempChildForm in MdiForm.MdiChildren)
{
if (tempChildForm.Name == ChildForm.Name.ToString())
{
if (tempChildForm.WindowState == FormWindowState.Minimized)
{
tempChildForm.WindowState = FormWindowState.Normal;
}
tempChildForm.Activate();
return;
}
}
ChildForm.MdiParent = MdiForm;
ChildForm.Show();
}
#endregion
最后关闭的时候,清理一下。this.Dispose()
/// <summary>
/// 名称:CheckChildOpenState
/// 功能:用子窗体的Name进行判断是否已实例化,如果存在则将他激活
/// </summary>
/// <param name="MdiForm">容器窗体</param>
/// <param name="ChildForm">子窗体</param>
public static void CheckChildOpenState(Form MdiForm, Form ChildForm)
{
foreach (Form tempChildForm in MdiForm.MdiChildren)
{
if (tempChildForm.Name == ChildForm.Name.ToString())
{
if (tempChildForm.WindowState == FormWindowState.Minimized)
{
tempChildForm.WindowState = FormWindowState.Normal;
}
tempChildForm.Activate();
return;
}
}
ChildForm.MdiParent = MdiForm;
ChildForm.Show();
}
#endregion
最后关闭的时候,清理一下。this.Dispose()
#10
我是想关子窗体的时候,就把子窗体的内存释放,用托管的,似乎一直在增加中
#11
窗口关闭的时候自动执行Form.Dispose() 方法,释放的是非托管资源。
GC.Collect()释放的才是托管资源
#12
Form.Close(),Form.Dispose(),GC.Collect()
上面的三个我全都用了,但是内存还是只增不少
上面的三个我全都用了,但是内存还是只增不少
#13
自已顶
#14
每次打开都会实例化一个对象,内存上都会增加这个事正常的呀。
只是垃圾回收的时候,可能第一次扫描,并不会去回收这些没有引用的对象,一些对象会经过多次回收才能回收掉的。
你可以反复的打开关闭,一段时间后再看看是什么情况呀。
只是垃圾回收的时候,可能第一次扫描,并不会去回收这些没有引用的对象,一些对象会经过多次回收才能回收掉的。
你可以反复的打开关闭,一段时间后再看看是什么情况呀。