2013-02-07 27 views
0

我在一個窗體(frmDash)中創建了一個項目,在容器中添加了幾個窗體作爲控件。使用窗體作爲控件時的內存泄漏

frmChart.TopLevel = False 
frmChart.FormBorderStyle = False 
frmChart.ControlBox = False 
container.Controls.Add(frmChart) 

當我關閉frmDash時,內存減少但沒有達到預期的那麼多。
因此,每次我重新打開frmDash時,內存都會隨着打開之前的時間而增加。
當我關閉frmDash:

For each frm as frmChart in container.Controls 
    frm.Close 
Next 

container.Controls.Clear 
container.Dispose 

而且在frmChart處置方法處置我,我有(數據表,列表,圖表 - 我知道我不應該丟棄一些人的一切,但我想發現什麼是錯的)。
有誰知道我在做什麼錯?

我發現這個here
我也想提一提的是,DataSet.Clear()和DataSet.Dispose()不會使由GC清除行。 .Clear()方法將刪除數據集內每個數據表中的所有數據行。但是,它不會刪除表格和關係。此外,.Dispose()方法由DataSet MarshalByValueComonent的基類實現,因此它不釋放數據集的受管資源。

要讓GC清除所有數據表和數據行,請將ds設置爲空,以便不引用原始數據集的所有受管資源,並且GC最終可以清除它們。另一種方法是使用DataSet.Reset,因此數據集將處於初始化狀態,不會添加任何表或關係。

如果這是真的,我必須設置每個數據表爲無,因爲知道我只是處置它。

我這樣做了,我設置了每一個我用的數據表,但內存泄漏仍然存在。

+1

你的代碼是錯誤的,但是這不是問題。當然,你認爲任務管理器是一個適合託管代碼的內存分析器的經典錯誤。不是這樣。通過編寫測試代碼來獲得信心,創建並破壞表單一百萬次。如果這樣就爆發了*做*使用真正的.NET分析器。 –

+0

感謝您的評論。我會嘗試。 – Nianios

+0

@HansPassant。我下載了redgate的內存配置文件,它告訴我我做錯了什麼。你是對的,沒有.Net profiler就像沒有地圖一樣旅行。謝謝 – Nianios

回答

0

如果您爲控件創建任何事件處理程序,則還需要釋放這些事件處理程序。 .Net的GC將掃描它的對象來查找對象的鏈接。調用dispose將阻止您引用該對象,但如果仍然存在事件處理程序,則GC認爲該事件仍可能會引發。

在VB.Net你可以做

RemoveHandler frmChart.Load, AddressOf ControlLoad 

這將然後讓GC從內存中刪除的對象。

希望這有助於

戴夫

+0

不,不是,我已經刪除了處理程序。 – Nianios

+0

因此,因爲我找到了一種通過內存分析器查找內存泄漏的方法,所以我接受您的答案是正確的,爲您的努力和時間。謝謝 – Nianios