2010-11-13 99 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()