具有多个用户控件的WPF应用程序
我正在创建一个简单的WPF测试项目,其中包含多个UserControls(而不是页面)。我正在使用Switcher类在不同的UserControls之间导航。当我导航到不同的页面时,我观察到每个UserControle Navigation上的内存消耗不断增加,并且没有调用GC具有多个用户控件的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?
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);它起作用了。。谢谢