首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >销毁控件

销毁控件
EN

Stack Overflow用户
提问于 2010-11-14 02:03:34
回答 5查看 6.6K关注 0票数 4

我使用for循环来生成一些控件。每个控件呈现一种特殊的可视化效果。我不能使用像ListBox这样的控件或者其他类似的东西。我必须使用我的方法。生成的控件驻留在画布中。一段时间后,一些控件就不再需要了。必须删除某些控件。我可以通过以下方式手动删除控件:

代码语言:javascript
复制
c.Children.Remove( ... );

这条线。如何确定控件确实是从be垃圾收集中收集的?也许该控件已经存在于内存中...我如何确保这一点?

问题是我生成的数据是以吨计的!

提前感谢!:-)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-14 06:05:27

只要没有任何东西持有对控件的引用,垃圾回收器就会清除它,您就没有什么可担心的了。通常,从包含该控件的集合中移除该控件是您需要做的全部工作。

但您必须小心使用事件处理程序。如果对象A订阅了对象B引发的事件,则对象B持有对对象A的引用。如果您的控件订阅了(比方说) Canvas.IsEnabledChanged,您可以将它们从Canvas中移除,但Canvas仍将持有对它们的引用,以便在IsEnabled发生更改时通知它们,并且不会对它们进行垃圾回收。这是.NET应用程序中“内存泄漏”的最常见原因。(它们不是真正的内存泄漏,但也可能是。)

票数 1
EN

Stack Overflow用户

发布于 2010-11-14 02:10:34

因此,如果您调用Destroy该控件,并且没有在内存中维护对该控件的任何其他引用(例如在控件的哈希表中或其他什么地方),那么GC将收集它。

不要试图强迫.NET GC做一些花哨的事情,让它在库作者设计的时间内完成它的工作。如果你Destroy它,它将会消失,在适当的时候。

最后,如果您担心它仍然在消耗内存,那么是时候开始分析您的代码了,比如使用RedGate Ant。

票数 4
EN

Stack Overflow用户

发布于 2010-11-14 02:12:17

根据您使用的控件,您可能需要调用Control.Dispose()来释放所有资源。请注意,您正在使用非托管资源(Learn more)

我想这不是你的案子。

然后,垃圾收集器将为您收集对象。

此外,这篇关于垃圾收集器如何工作的文章可能非常有趣:

http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspx

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4173952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档