如何销毁用户控件以释放内存?

时间:2014-04-15 13:21:23

标签: .net wpf memory-management memory-leaks

我正在使用WPF应用程序,我有一个方法让我们称之为 GetUIElement(),我的方法返回 CustomUserControl ,并且我有一个for循环,我在其中调用 GetUIElement ,问题是当我在for循环中进行1000次迭代时,我的应用程序会消耗太多内存。

PS:

  • 即使我更改 GetUIElement()签名以返回一个简单的Button,我也能看到内存不断增长
  • CustomUserControl 的构造函数和析构函数中,我放了一些调试代码来了解我的对象的生命周期,我看到它们都被同时销毁了在循环之后,我解释了为什么我的应用程序消耗了太多内存,它们都被保存在内存中直到循环结束。 我希望我很清楚,不要犹豫,告诉我你是否想要更多解释。 以下是代码的一些部分:

    foreach (var item in Data)
    {
    var element = GetUIElement(item);
    
    //...
    }
    
    public FrameworkElement GetUIElement()
    {
        CustomUserControl control = new CustomUserControl();
        control.StartButton.Style = Application.Current.Resources["StandardButton"] as Style;
        return control;
    }
    

3 个答案:

答案 0 :(得分:1)

从您所显示的内容中没有任何错误,GC不会因为某个对象被取消引用而自动启动。如果出现问题,您显示的代码不是其中的一部分。

如果你有一个真正的泄漏,它可能是到那个创建的控件存储/ ref在其他地方。

答案 1 :(得分:0)

你可以打电话给垃圾:

System.GC.Collect();

但是,我只是想说,如果你真的需要它,你的代码似乎很奇怪...... 您知道可以使用自定义项模板创建ListBox吗?

答案 2 :(得分:0)

为什么你认为你的应用程序消耗了太多内存?

GC会在需要时收集内存。

如果GC正在等待收集循环结束,那是因为GC确定它在循环中不需要内存。

如果内存在循环结束时回落,则没有内存泄漏。

任务管理器报告了多少内存?

因此,您的应用会消耗1.5 GB的内存 GC可能仍在继续工作 它正在收集内存然后它需要。

您的应用正在消耗如此多的资源,导致您无法运行其他应用程序。 这并不意味着GC没有做好自己的工作。

您丢弃的1000个用户控件的用途是什么?

你可以这样做,但它不会修复你的程序

foreach (var item in Data)
{
   using (var element = GetUIElement(item))
   {
       //...
   }
   System.GC.Collect();
}