【问题标题】:WPF app with multiple usercontrols具有多个用户控件的 WPF 应用程序
【发布时间】:2013-08-05 06:23:39
【问题描述】:

我正在创建简单的 WPF 测试项目,其中包含多个 UserControls(Insteda of Pages)。我正在使用 Switcher 类在不同的 UserControls 之间导航。当我导航到不同的页面时,我观察到每个 UserControle 的内存消耗都在增加不调用 Navigation 和 GC。

    1.So am i doing something wrong in following code? 
    2.Which part of the code consuming more memory? 
    3.Do i need to invoke GC for disposing my UserControls on each new UserControle creation? 
      If need how can i invoke GC?


public void On_Navigate_Click()
    {
        UserControle newusercontrole=new UserControle();
        DataSet ds = new DataSet();
        ds=con.getSome_Datafrom_SQL();//Gets data from SQL via connection class
        dataGrid_test.ItemsSource = ds.Tables[0].DefaultView;

        Grid.SetColumn(newusercontrole, 1);//dataGrid_test is inside newusercontrole and following is the code to add "this"  usercontrol to the main window.
        Grid.SetRow(newusercontrole, 1);
        Grid.SetZIndex(newusercontrole, 10);
        Container.Children.Add(newusercontrole);
    }

【问题讨论】:

  • 您正在创建一个新的用户控件,并在每次单击按钮时将其放入子集合中。以前的 UC 是如何从 children 集合中删除的?如果还有对prev的引用。 UC、GC 不会收集。
  • 是的,现在我更改了我的代码。在添加新的 UserControl 之前,我正在删除以前的 UC,如下所示。 Container.Children.Remove(oldusercontrole);他们仍然有很多内存泄漏。
  • Container.Children.Remove(oldusercontrole);它的工作..谢谢..

标签: wpf user-controls garbage-collection


【解决方案1】:

首先,我必须指出,如果垃圾收集真的没有发生(如你所说),那不是你的错,它确实不是意味着你'重新做错事。这只意味着 CLR 还没有认为你的系统处于内存压力之下。

现在,无论如何要手动调用垃圾回收周期,您可以使用GC.Collect() 静态方法。如果垃圾收集实际开始并且您的内存消耗仍然高得不合理,这意味着您可能做错了什么:您保留了越来越多的不必要的对象引用,而垃圾收集器无法安全地收集这些对象。这是一种内存泄漏。

就您的代码而言,我认为问题出在您发布的方法的末尾:

Container.Children.Add(newusercontrole);

这似乎向集合Container.Children 添加了一个新对象(每次点击)。如果这没有在其他地方删除,这可能是您的内存泄漏的原因。我不知道适合您的用例的解决方案是什么(因为我不确切知道您的 UI 应该如何表现),但您可能需要找到一种方法来删除最后添加的 UserControle Container.Children。如果你可以使用 LINQ,那么 OfType<T>() 和 Last() 方法可以用来找到它。

无论如何,不​​要在生产代码中留下GC.Collect() 行。仅使用它来强制收集循环以进行测试,例如这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2011-01-17
    • 1970-01-01
    • 2023-03-29
    • 2013-05-31
    • 2012-01-19
    • 2014-11-29
    相关资源
    最近更新 更多