我正在创建简单的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);
}
答案 0 :(得分:1)
首先,我必须指出,如果真的没有发生垃圾收集(正如你所说的那样),它不是你的错,而不意味着你'做错了。这只意味着CLR认为你的系统还没有内存压力。
现在,要手动调用垃圾回收周期,您可以使用GC.Collect()
静态方法。如果垃圾收集实际开始并且您的内存消耗仍然过高,这意味着您可能做错了:您保留了越来越多的不必要的对象引用,垃圾收集器无法安全地收集这些对象。这是一种内存泄漏。
就您的代码而言,我认为问题出在您发布的方法的最后:
Container.Children.Add(newusercontrole);
这似乎在集合Container.Children
中添加了一个新对象(每次点击)。如果在其他地方没有删除,这可能是您的内存泄漏的原因。我不知道适合您的用例的解决方案是什么(因为我不确切知道您的UI应该如何表现),但您可能需要找到一种方法来删除最后添加的UserControle
来自Container.Children
。如果您可以使用LINQ,那么方法OfType<T>()
和Last()
可用于查找它。
在任何情况下,请勿将GC.Collect()
行留在生产代码中。仅用于强制收集周期用于测试目的,如此。