Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个用户控件的WPF应用程序_Wpf_User Controls_Garbage Collection - Fatal编程技术网

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

具有多个用户控件的WPF应用程序,wpf,user-controls,garbage-collection,Wpf,User Controls,Garbage Collection,我正在创建一个简单的WPF测试项目,其中包含多个UserControls(而不是页面)。我正在使用Switcher类在不同的UserControls之间导航。当我导航到不同的页面时,我观察到每个UserControle Navigation上的内存消耗不断增加,并且没有调用GC 1.So am i doing something wrong in following code? 2.Which part of the code consuming more memory?

我正在创建一个简单的WPF测试项目,其中包含多个UserControls(而不是页面)。我正在使用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);
    }

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

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

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

Container.Children.Add(newusercontrole);
这似乎会(每次单击)向集合
容器中添加一个新对象。Children
。如果没有在其他地方删除,这可能是内存泄漏的原因。我不知道适合您的用例的解决方案是什么(因为我不知道您的UI应该如何工作),但您可能需要找到一种方法来删除从
容器中添加的最后一个
UserControle
。Children
。如果可以使用LINQ,那么type()和
Last()
的方法可以用来查找它


在任何情况下,都不要将
GC.Collect()
行留在生产代码中。仅用于强制收集循环以进行测试,如本例

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