C# 使用自定义表关闭winform后内存泄漏

C# 使用自定义表关闭winform后内存泄漏,c#,.net,winforms,memory-leaks,C#,.net,Winforms,Memory Leaks,我有一个C#WinForm对话框,其中包含自定义表控件,其中的行和单元格也都是自定义控件。关闭(而不是隐藏)此对话框后,我发现内存泄漏(这已由.NET内存探查器确认) 从我从profiler获得的信息来看,我认为它可以处理这些控件的处理,但我不确定如何修复它 在表控件中,我有行列表: private readonly List<CustomRow> _rows = new List<CustomRow>(); 但现在我想是否需要将处理代码移到.cs文件中,并添加类似的

我有一个C#WinForm对话框,其中包含自定义表控件,其中的行和单元格也都是自定义控件。关闭(而不是隐藏)此对话框后,我发现内存泄漏(这已由.NET内存探查器确认)

从我从profiler获得的信息来看,我认为它可以处理这些控件的处理,但我不确定如何修复它

在表控件中,我有行列表:

private readonly List<CustomRow> _rows = new List<CustomRow>(); 
但现在我想是否需要将处理代码移到.cs文件中,并添加类似的内容,例如表:

protected override void Dispose(bool disposing)
{
     if (disposing)
     {
          if (components != null)
          {
              components.Dispose();
          }
          // dispose each row here                
     }
     base.Dispose(disposing);
}

或者这是自动完成的,内存泄漏的原因不同?(可能是什么?

处置的模式与您认为的不同<代码>处置不能防止内存泄漏

dispose模式用于使用非托管代码防止非托管内存泄漏。也就是说,如果使用非托管代码/库,则应该在Dispose方法上调用(非托管代码的)deinitialize


您面临的问题是,数据集的寿命比表单的寿命长。这意味着,当控件在datarow/表上注册事件(如RowChanged事件)时,该表单由数据集引用的数据控件保持活动状态(因为有eventhandler)。请记住,事件处理程序是强引用,可能会导致像您这样的内存泄漏

我不知道您正在使用什么组件,但您可能可以为此创建一个简单的修复程序

例如: 当表单关闭时,只需重置
GridView1.DataSource=Null
。这将强制组件取消注册数据表的更改/更改事件


因此,您将数据“绑定”到组件的方式,只是以相同的方式“解除绑定”并再次配置文件

,以确保在显示-hm对话框时使用
Show
而不是
ShowDialog
?而
Dispose
方法被称为?@IvanStoev我使用Show(),而不是ShowDialog()。更重要的一点是,这些对话框不是直接显示的,而是作为控件添加到选项卡式窗体(每个选项卡一个),然后为主窗体调用Show()。谢谢,我认为您可能是正确的。组件由我们自己编写。不使用数据绑定,只使用addRow()方法添加数据。我可以用clearAll()方法清除所有内容。您认为我应该在处理表单时尝试调用它吗?您应该检查是否正在
数据表/DataSet
上注册事件。如果是,请在Dispose/Closing上注销它们
protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
         components.Dispose();
    }
    base.Dispose(disposing);
}
protected override void Dispose(bool disposing)
{
     if (disposing)
     {
          if (components != null)
          {
              components.Dispose();
          }
          // dispose each row here                
     }
     base.Dispose(disposing);
}