2015-12-26 29 views
4

我有C#WinForm對話框,其中包含自定義表格控件,行和單元格都是自定義控件。關閉(不隱藏)這個對話框後,我有內存泄漏(這是由.NET內存分析器確認)。用自定義表格關閉winform後內存泄漏

從我從profiler獲得的信息我認爲它處理這些控件的處置,但我不知道如何解決它。

在表控制我行的列表:

private readonly List<CustomRow> _rows = new List<CustomRow>(); 

在每一行中我有小區列表:

List<CustomCell> _cells = new List<CustomCell>(); 

現在的控件處置被自動生成的代碼完成在designer.cs中:

protected override void Dispose(bool disposing) 
{ 
    if (disposing && (components != null)) 
    { 
     components.Dispose(); 
    } 
    base.Dispose(disposing); 
} 

但現在我想我是否需要將配置代碼移動到.cs文件並添加s omething這樣,例如用於表:

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

或者這是自動完成的,內存泄漏的原因是不同的? (它可能是什麼?)

+0

只是爲了讓道路事件當然,在顯示你的-hm對話框時,你使用'Show'而不是'ShowDialog'?並且'Dispose'方法被調用? –

+0

@IvanStoev我使用Show(),而不是ShowDialog()。更重要的是,這些對話框不直接顯示,而是作爲控件添加到選項卡形式(每個選項卡一個),然後調用主窗體的Show() – demonplus

回答

3

Dispose的模式與您認爲的不同。 Dispose不能防止內存泄漏。

dispose模式用於防止使用非管理代碼的非託管內存泄漏。意思是,如果使用非託管代碼/庫,應該在Dispose方法上調用(非託管代碼的)初始化。


你面對的問題是,你有生活比你形成較長的數據集。意思是,當上一個數據行/表(如RowChanged事件)控制registeres事件的形式被保持活着由數據集,其被引用(因爲一個事件處理程序的)中的數據控制。請記住,事件處理程序是強引用,可能會導致像你的內存泄漏。

我不知道你正在使用什麼組件,但你可能可以爲此創建一個簡單的修復。

例如: 當窗體關閉/關閉時,只需重置GridView1.DataSource = Null即可。這將迫使部分註銷改變/改變的DataTable

所以你「綁定」的數據的組件,只是「解除綁定」用同樣的方式和個人資料再

+0

謝謝,我認爲你可能是正確的。這些組件是由我們自己編寫的。數據綁定不用於添加數據,只使用addRow()方法。我可以通過clearAll()方法清除所有內容。你認爲我應該在表格被處理時嘗試打電話嗎? – demonplus

+0

你應該檢查你是否在'DataTable/DataSet'上註冊事件。如果是這樣,請在Dispose/Closing上取消註冊 –