我有一个
Windows窗体应用程序,其中单击某些按钮从第二个窗体创建对象.在用户关闭此第二张表单时,此表单使用的内存不会被释放(根据任务管理器).
@H_301_2@我尝试在主代码中的exit按钮,this.close(),form2 = null上使用this.dispose(),并在处理之前通过代码清除了此窗体中的所有控件.这些都没有起作用,并且每次用户点击按钮时,应用程序的内存使用量增加,而前一个实例使用的内存不会被释放.
@H_301_2@我该用什么来解决这个问题?
解决方法
Calling Dispose不会清除对象使用的内存. Dispose意在用于运行用户定义的代码,释放不会自动释放的资源,例如文件句柄,网络句柄,数据库连接等.
@H_301_2@可能的罪魁祸首可能是将事件附加到其外的对象(可能是第一种形式)的第二种形式,并且永远不会附加它们.
@H_301_2@如果您有第二种形式的任何事件,请将其附加在您的OnClose覆盖中 – 这将使得第二个格式符合垃圾收集的条件.
@H_301_2@请注意,.NET垃圾收集器是非常不可预测的,它可能会在清理所有符合资格的旧版本的实例之前创建一些对象实例.一个确定的方法(不使用内存分析器)是在终结器中放置一个断点:
public class MyForm : Form { ~MyForm() { //breakpoint here } }@H_301_2@如果终结者被调用,那么这个类可以,如果没有,你仍然有泄漏.您也可以给GC一个“踢” – 但仅用于故障排除 – 不要将此代码留在生产中 – 启动GC:
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();@H_301_2@将上述代码放在你关闭后运行的地方,并处理第二个表单.您应该在MyForm终结器中点击断点.