2010-11-13 164 views
4

我使用for循環來生成一些控件。每個控件呈現特殊的可視化效果我不能使用像ListBox這樣的控件或類似的東西。我必須用我的方法。生成的控件託管在Canvas中。過了一段時間,一些控件不再需要。一些控件必須刪除。我可以通過手動刪除一個控件銷燬控件

c.Children.Remove(...); 

這一行。我如何確定這些控件是真正從垃圾收集中收集的?也許這個控件已經存在於內存中了。我如何確保這一點?

問題是我生成的數據噸!

提前致謝! :-)

回答

1

只要沒有任何東西持有對控件的引用,垃圾回收器就會擺脫它,並且您無需擔心。通常,從包含它的集合中刪除一個控件,你只需要做。

但是你必須小心事件處理程序。如果對象A訂閱了對象B引發的事件,則對象B將保留對對象A的引用。如果您的控件訂閱了例如Canvas.IsEnabledChanged,則可以將它們從Canvas中刪除,但Canvas仍將保留對它們的引用。它可以在IsEnabled更改時通知他們,並且它們不會被垃圾收集。這是.NET應用程序中「內存泄漏」的最常見原因。 (他們不是真正的內存泄漏,但他們可能是)

4

所以如果你打電話給Destroy這個控件,並且你沒有在內存中維護任何其他控件的引用(比如在控件的hashtable中),那麼GC將收集它。

不要試圖強迫.NET GC做一些奇特的事情,讓它在圖書館作者設計的時候自己的工作。如果你Destroy它,它會在適當的時候消失。

最後,如果您擔心它仍在使用內存,則可以開始分析代碼了,例如使用RedGate Ants。

+0

它看起來像OP使用WPF(它沒有控件上的Dispose()方法)而不是Winforms。 – 2010-11-13 19:14:32

+0

@ZachJohnson〜哦,廢話,你說得對。無論如何,我的代碼的其餘部分,除了'Destroy'特定的評論,仍然代表WPF,不是嗎?但是,是的,System.Object只定義了繼承'Finalize',而不是'Destroy' ...但是,一個單獨的對象_could_繼承'IDisposable'或者有一個'Dispose'方法(儘管它不會有任何影響) – jcolebrand 2010-11-13 19:25:53

2

你並不需要。這就是垃圾收集的意義:只要有太多的死對象,垃圾收集就會跳入並清除它們。或者不清潔:GC更清楚什麼時候清除。

1

如果你確定對象的arent任何地方提到了,你可以強制調用垃圾收集器的GC .Collect()