具有多个用户控件的WPF应用程序

时间:2013-08-05 06:23:40

标签: wpf user-controls garbage-collection

我正在创建简单的WPF测试项目,其中包含多个UserControls(Insteda of Pages)。我使用Switcher Class在不同的UserControl之间导航。当我导航到不同的页面时,我观察到内存消耗在每个UserControle上不断增加不调用Navigationand 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);
    }

1 个答案:

答案 0 :(得分:1)

首先,我必须指出,如果真的没有发生垃圾收集(正如你所说的那样),它不是你的错,而意味着你'做错了。这只意味着CLR认为你的系统还没有内存压力。

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

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

Container.Children.Add(newusercontrole);

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

在任何情况下,请勿将GC.Collect()行留在生产代码中。仅用于强制收集周期用于测试目的,如此。