我在一個窗體(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,因此數據集將處於初始化狀態,不會添加任何表或關係。
如果這是真的,我必須設置每個數據表爲無,因爲知道我只是處置它。
我這樣做了,我設置了每一個我用的數據表,但內存泄漏仍然存在。
你的代碼是錯誤的,但是這不是問題。當然,你認爲任務管理器是一個適合託管代碼的內存分析器的經典錯誤。不是這樣。通過編寫測試代碼來獲得信心,創建並破壞表單一百萬次。如果這樣就爆發了*做*使用真正的.NET分析器。 –
感謝您的評論。我會嘗試。 – Nianios
@HansPassant。我下載了redgate的內存配置文件,它告訴我我做錯了什麼。你是對的,沒有.Net profiler就像沒有地圖一樣旅行。謝謝 – Nianios