我有一个Windows窗体应用程序,其中单击某些按钮从第二个窗体创建对象.在用户关闭此第二个表单时,不会释放此表单使用的内存(根据任务管理器).
我试图使用this.dispose()
退出按钮,this.close()
,form2 = null
在主要的代码,并试图通过代码处理之前,从这种形式的清除所有控件.这些都没有奏效,每次用户单击按钮时,应用程序的内存使用量都会增加,并且前一个实例使用的内存不会被释放.
我该用什么来解决这个问题?
Igo*_*aka 18
调用Dispose
不会清理对象使用的内存.Dispose
用于运行用户定义的代码,用于释放未自动释放的资源 - 如文件句柄,网络句柄,数据库连接等.
可能的罪魁祸首可能是第二种形式将事件附加到它之外的对象(可能是第一种形式?)并且永远不会取消它们.
如果您在第二个表单中有任何事件,请在OnClose覆盖中取消它们 - 这将使第二个表单符合垃圾回收的条件.
注意,.NET垃圾收集器是非常不可预测的,它可能会在清理所有符合收集条件的旧实例之前创建一个对象的几个实例.一种确定的方法(不依赖于内存分析器)是在终结器中放置一个断点:
public class MyForm : Form {
~MyForm() {
//breakpoint here
}
}
Run Code Online (Sandbox Code Playgroud)
如果调用终结器然后这个类没问题,如果没有,你仍然有泄漏.您也可以给GC一个"踢" - 但仅用于故障排除 - 不要将此代码留在生产中 - 通过启动GC:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Run Code Online (Sandbox Code Playgroud)
将上面的代码放在关闭后运行的位置并处理第二个表单.你应该在MyForm
终结器中点击断点.
归档时间: |
|
查看次数: |
23035 次 |
最近记录: |