如何在 VB.Net 中正确地从内存中删除控件? [复制]

Posted

技术标签:

【中文标题】如何在 VB.Net 中正确地从内存中删除控件? [复制]【英文标题】:How to properly remove a control from memory, in VB.Net? [duplicate] 【发布时间】:2017-05-09 03:34:19 【问题描述】:

比较简单的问题。

我有一个面板,上面有一些文本框,都是动态创建的。 用户填写一些文本框,然后继续关闭面板。

现在在代码中我使用该行;

Me.Pnl_Main.Controls.Clear()

这工作正常,面板内容被“删除”。

问题是,当文本框为相同目的重新创建时,它们仍然包含它们之前的值。

不幸的是,大多数 UI 都是这样创建的,这不可避免地会导致内存泄漏。

所以我的问题是,有没有合适的方法从内存中完全删除控件?还是我需要运行一个例程来将所有文本值设置为 Nothing?

提前致谢。

【问题讨论】:

我认为问题是在执行.Clear() 后,对您创建的文本框的引用仍然存在于某处。我认为您没有内存泄漏问题,因为您总是使用相同的文本框实例(这就是您看到以前文本的原因)。当然,文本框是在表单之外引用的,比泄漏是可能的。您能否展示如何创建文本框并将它们添加到面板的代码 Me.Pnl_Main.Controls.Clear() 之后,您可以将 textbox 变量设置为空。 文本框实际上是我制作的用户控件的一部分(这样可以在动态创建大量控件时节省时间)。 Public PG1 As New ConditionReportPage1 Me.pnl_main.controls.add(PG1) 如果文本框是 UserControl 的一部分,那么您无需担心内存泄漏。当 UserControl 将被释放时,文本框也将被释放。 【参考方案1】:

只要代码的某些部分包含对控件的引用,它们就不会从内存中清除。您必须删除对这些控件的所有引用,例如

 Me.Pnl_Main.Controls = Nothing

只要这些控件没有在其他任何地方被引用,它们就可以从内存中删除,但您实际上并不能控制它们何时最终从内存中删除。这是由垃圾收集器完成的,它通常会在内存开始变满时自动运行。

【讨论】:

这实际上什么也没做。在 VB.NET 中将事物设置为 Nothing 是没有意义的。原始问题中的代码是正确的,Bob 应该调用Clear。他缺少的部分是他需要首先遍历集合中的每个控件并调用其Dispose 成员函数。完成后,他可以致电Clear 清空集合。 查看此问题及其链接的问题:***.com/questions/1969705/…【参考方案2】:

处理一个对象与内存没有特别的关系。已处置的对象可以更快地从内存中删除,但 .NET 会在它准备就绪时回收内存。分配新内存比重新分配现有内存要便宜得多,所以大部分时间都是这样做的。

【讨论】:

这是真的,也不是。调用 Dispose 与垃圾收集器毫无关系;它释放非托管内存,而垃圾收集器处理托管内存。因此调用 Dispose 对防止内存泄漏至关重要。如果一个类型实现了 IDisposable,你必须调用它的 Dispose 方法,否则你会泄漏。 Control 类更加特殊(更多详细信息请参见副本)。您绝对必须为从其父控件中动态删除的每个控件调用 Dispose 方法。使答案正确的方法是将“disposed”替换为“unreferenced”。

以上是关于如何在 VB.Net 中正确地从内存中删除控件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何解决VB中WebBrowser控件持续打开网页占用的内存

我应该如何最好地从 VB.net 查询我的数据集?

如何正确地从有效载荷中添加和删除元素? (或有条件更换)

如何应用VB.NET MonthCalendar控件

如何安全地从内存中清除使用 new 关键字创建的对象(带有属性)?

如何使用 vb.net 从 MS Access DB 表单中找出 Activex 控件