0

我正在创建包含多个 UserControls(Insteda of Pages)的简单 WPF 测试项目。我正在使用 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);
    }
4

1 回答 1

1

首先,我必须指出,如果垃圾收集真的没有发生(如你所说),那不是你的错,也不意味着你做错了什么。这仅意味着 CLR 认为您的系统尚未承受内存压力。

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

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

Container.Children.Add(newusercontrole);

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

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

于 2013-08-05T06:44:26.227 回答