2013-08-05 62 views
0

我正在創建包含多個用戶控件(頁面Insteda)的簡單WPF測試項目。我使用切換器類來瀏覽不同的用戶控件之間。當我導航到不同的頁面時,我觀察到內存消耗保持每增加一個UserControle Navigationand GC都不會被調用。WPF應用程序與多個用戶控件

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

您正在創建一個新的usercontrol,並在每次單擊該按鈕時將其放入子集合中。以前的UC如何從兒童收藏中刪除?如果還有對prev的引用。 UC,GC不會收集。 – keft

+0

是的,現在我改變了我的代碼。在添加新的UserControl之前,我將刪除以前的UC,如下所示。 Container.Children.Remove(oldusercontrole); 他們仍然有很多內存泄漏。 – ManjuVijayan

+0

Container.Children.Remove(oldusercontrole); 其工作.. 謝謝.. – ManjuVijayan

回答

1

首先,我必須指出,如果垃圾收集真的是沒有發生(如你所說),它你錯了,它不意味着你做錯了什麼。這隻意味着CLR不認爲你的系統還處於內存壓力之下。

現在,無論如何要手動調用垃圾回收循環,您可以使用GC.Collect()靜態方法。如果一個垃圾回收實際上開始,並且你的內存消耗仍然不合理地高,這意味着你可能做錯了一些事情:你保持越來越多的不必要的對象引用,垃圾回收器不能安全地收集這些對象。這是一種內存泄漏。

至於你的代碼去,我覺得現在的問題是你貼的方法的末尾:

Container.Children.Add(newusercontrole); 

這似乎是一個新的對象(每次點擊)添加到集合Container.Children。如果這在其他地方沒有被刪除,這可能是你的內存泄漏的原因。我不知道適合你的用例的解決方案是什麼(因爲我不知道你的用戶界面應該如何表現),但是你可能需要找到一種方法去除Container.Children中添加的最後一個UserControle。如果您可以使用LINQ,那麼可以使用OfType<T>()Last()方法找到它。

在任何情況下,請勿將GC.Collect()行保留在生產代碼中。僅用於強制收集週期以進行測試,就像這樣。

+0

感謝您的答覆.. – ManjuVijayan