我使用for循环来生成一些控件。每个控件呈现一种特殊的可视化效果。我不能使用像ListBox这样的控件或者其他类似的东西。我必须使用我的方法。生成的控件驻留在画布中。一段时间后,一些控件就不再需要了。必须删除某些控件。我可以通过以下方式手动删除控件:
c.Children.Remove( ... );这条线。如何确定控件确实是从be垃圾收集中收集的?也许该控件已经存在于内存中...我如何确保这一点?
问题是我生成的数据是以吨计的!
提前感谢!:-)
发布于 2010-11-14 06:05:27
只要没有任何东西持有对控件的引用,垃圾回收器就会清除它,您就没有什么可担心的了。通常,从包含该控件的集合中移除该控件是您需要做的全部工作。
但您必须小心使用事件处理程序。如果对象A订阅了对象B引发的事件,则对象B持有对对象A的引用。如果您的控件订阅了(比方说) Canvas.IsEnabledChanged,您可以将它们从Canvas中移除,但Canvas仍将持有对它们的引用,以便在IsEnabled发生更改时通知它们,并且不会对它们进行垃圾回收。这是.NET应用程序中“内存泄漏”的最常见原因。(它们不是真正的内存泄漏,但也可能是。)
发布于 2010-11-14 02:10:34
因此,如果您调用Destroy该控件,并且没有在内存中维护对该控件的任何其他引用(例如在控件的哈希表中或其他什么地方),那么GC将收集它。
不要试图强迫.NET GC做一些花哨的事情,让它在库作者设计的时间内完成它的工作。如果你Destroy它,它将会消失,在适当的时候。
最后,如果您担心它仍然在消耗内存,那么是时候开始分析您的代码了,比如使用RedGate Ant。
发布于 2010-11-14 02:12:17
根据您使用的控件,您可能需要调用Control.Dispose()来释放所有资源。请注意,您正在使用非托管资源(Learn more)
我想这不是你的案子。
然后,垃圾收集器将为您收集对象。
此外,这篇关于垃圾收集器如何工作的文章可能非常有趣:
http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspx
https://stackoverflow.com/questions/4173952
复制相似问题