【问题标题】:how to free Memory ( User Control )如何释放内存(用户控制)
【发布时间】:2009-01-28 07:38:24
【问题描述】:

我正在使用 WPF。

在运行时动态添加用户控件后,如何处置该用户控件。 因为用户控件没有 Dispose 方法。我不想等到垃圾收集器运行。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    即使您能够释放它,也不会释放内存。 Dispose 不是关于释放内存 - 它是关于释放非内存资源(例如 GDI 句柄)。我假设如果这个类没有实现 IDisposable,它就没有任何非内存资源可以释放。

    【讨论】:

      【解决方案2】:

      我认为你的设计有缺陷。 如果您仍然对某些内容有引用,那么您无论如何都不应该尝试释放内存。 一旦某个东西实际上不再存在(不再对其进行引用),它实际上就是可用的内存,下次当您需要一些没有 GC 就无法提供的内存时,它将变得空闲 [1] 并且可用。

      你的设计不是在浪费内存,它只是在搅动内存。这本身可能有问题,但不会浪费内存。如果您的设计在之后保留对控件的引用,则不再需要它们会浪费内存,但是您不能通过“删除”它们来“创可贴”解决问题。您需要以一种难以控制其生命周期的方式解决将这些控制权传递给整个地点的根本原因。

      [1] 禁止在此处不适用的终结器

      【讨论】:

        【解决方案3】:

        您是否有不想等待 GC 的原因?如果您从它的父控件中删除控件,因此没有对它的引用,那么 GC 会吃掉它,无需手动处理它。

        【讨论】:

          【解决方案4】:

          谢谢史蒂夫。

          首先,我经常在我的应用程序中添加大量 UsrCtr 元素。所以如果不立即删除,就会浪费大量内存。

          实际上我在几个地方使用 ForEach 循环来迭代应用程序(WinForm)上的所有元素,所以这个循环仍然显示 UserCtrs(在删除 UserCtr 作为 chld 之后)

          此外,我还通过自定义事件和委托将 UserCtrs 的引用传递到我项目中的其他几个地方。因此,如果将其添加到主窗体上的一个位置,仍然可能存在用户控件的引用存在于项目中的其他位置的可能性。

          【讨论】:

          • 如果在其他地方有对控件的引用,那么运行时将不会让您为它释放内存(即使有一些 .NET API 来执行此操作)。这将使这些引用无效 - .NET 是为了防止这种错误而发明的。
          • 您应该真正了解 GC 的工作原理。 “立即移除”和“仅在 gen0 或 gen1 中徘徊”之间存在很大差异。如果您经常创建在 很长 时间(进入 gen2)然后删除所有引用的对象,那可能很糟糕。
          猜你喜欢
          • 2014-05-29
          • 1970-01-01
          • 2015-10-25
          • 2019-08-18
          • 1970-01-01
          • 2016-12-24
          • 2011-01-31
          相关资源
          最近更新 更多