我使用for循环来生成一些控件。每个控件呈现特殊的可视化效果我不能使用像ListBox这样的控件或类似的东西。我必须用我的方法。生成的控件托管在Canvas中。过了一段时间,一些控件不再需要。一些控件必须删除。我可以通过手动删除一个控件销毁控件
c.Children.Remove(...);
这一行。我如何确定这些控件是真正从垃圾收集中收集的?也许这个控件已经存在于内存中了。我如何确保这一点?
问题是我生成的数据吨!
提前致谢! :-)
我使用for循环来生成一些控件。每个控件呈现特殊的可视化效果我不能使用像ListBox这样的控件或类似的东西。我必须用我的方法。生成的控件托管在Canvas中。过了一段时间,一些控件不再需要。一些控件必须删除。我可以通过手动删除一个控件销毁控件
c.Children.Remove(...);
这一行。我如何确定这些控件是真正从垃圾收集中收集的?也许这个控件已经存在于内存中了。我如何确保这一点?
问题是我生成的数据吨!
提前致谢! :-)
只要没有任何东西持有对控件的引用,垃圾回收器就会摆脱它,并且您无需担心。通常,从包含它的集合中删除一个控件,你只需要做。
但是你必须小心事件处理程序。如果对象A订阅了对象B引发的事件,则对象B将保留对对象A的引用。如果您的控件订阅了例如Canvas.IsEnabledChanged
,则可以将它们从Canvas
中删除,但Canvas
仍将保留对它们的引用。它可以在IsEnabled
更改时通知他们,并且它们不会被垃圾收集。这是.NET应用程序中“内存泄漏”的最常见原因。 (他们不是真正的内存泄漏,但他们可能是)
所以如果你打电话给Destroy这个控件,并且你没有在内存中维护任何其他控件的引用(比如在控件的hashtable中),那么GC将收集它。
不要试图强迫.NET GC做一些奇特的事情,让它在图书馆作者设计的时候自己的工作。如果你Destroy
它,它会在适当的时候消失。
最后,如果您担心它仍在使用内存,则可以开始分析代码了,例如使用RedGate Ants。
你并不需要。这就是垃圾收集的意义:只要有太多的死对象,垃圾收集就会跳入并清除它们。或者不清洁:GC更清楚什么时候清除。
根据您正在使用的控件,可能需要拨打Control.Dispose()
来释放所有资源。要小心你使用的是非托管资源(Learn more)
我认为这不是你的情况。
然后垃圾收集器会为你收集对象。
此外,这篇关于垃圾收集器的工作方式可能是很有意思:
http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspx
如果你确定对象的arent任何地方提到了,你可以强制调用垃圾收集器的GC .Collect()
它看起来像OP使用WPF(它没有控件上的Dispose()方法)而不是Winforms。 – 2010-11-13 19:14:32
@ZachJohnson〜哦,废话,你说得对。无论如何,我的代码的其余部分,除了'Destroy'特定的评论,仍然代表WPF,不是吗?但是,是的,System.Object只定义了继承'Finalize',而不是'Destroy' ...但是,一个单独的对象_could_继承'IDisposable'或者有一个'Dispose'方法(尽管它不会有任何影响) – jcolebrand 2010-11-13 19:25:53