Obj.Close()后内存不释放

时间:2013-11-12 09:12:45

标签: c# winforms

我在使用我们的系统进行内存管理方面存在问题。

基本上这是我的设计:

  1. 加载记录列表。 frmBrowse使用的内存 90MB

  2. 点击记录后,会弹出另一个表格,这是所选记录的详细表格 frmAP 内存使用110MB

    private void ViewRecord()
    {
        try
        {
            if(oAP!=null)
            oAP = new frmAP();
            oAP.LoadRecordDetails();
            oAP.Show();
        }
        catch (Exception ex)
        {
            clsClass.oGenMethods.ErrorMessage(ex.Message, "frmBrowse", "EditSearchFields");
        }
    }
    
  3. 当用户CLOSE时,我实际上是隐藏它(frmAP)以防止重新查询数据,例如查找表和其他 - frmAP - 内存使用110MB
  4. 在frmAP_Close()

    this.Hide();
    

    -Memory,110MB

    1. 隐藏表单(frmSomeForm)后,内存保持在110MB
    2. 当用户关闭表单(frmBrowse)时调用“frmAP”/实例化

      public void tsClose_Click(object sender,EventArgs e)         {

              if (oAP != null)
              {
                  oAP .Dispose();
                  oAP .Close();
                  GC.Collect();
              }
      

      }

    3. 问题是内存仍处于~110MB列表(frmBrowse)表格和记录表格(frmAp)是否已关闭。

      请咨询

      先谢谢

      更新

      我试图删除.Hide()以隔离问题,但内存仍在不断增长

1 个答案:

答案 0 :(得分:4)

调用Close不会释放与对象关联的内存。这是垃圾收集器的工作。 CloseDispose只是告诉对象释放它正在使用的任何非托管内存或资源。对象及其引用的所有内容仍然留在内存中。

要确保收集oAP,请将其设置为null:

oAP.Close();
oAP = null;

然而,这可能是错误的事情。垃圾收集器的重点是在需要时从未引用的对象中收集内存。因此,让它完成它的工作,不要强制它运行,你不需要将oAP设置为null,并且oAP并且当GC需要时将收集它引用的所有内容。 / p>