2013-08-05 2 views
0

Я создаю простой тестовый проект WPF, который содержит несколько UserControls (Insteda of Pages). Я использую класс Switcher для навигации между различными UserControls.Когда я перехожу на разные страницы, я заметил, что память продолжается при увеличении на каждой UserControle Navigation и 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 am, удаляющего предыдущий UC, как показано ниже. Container.Children.Remove (oldusercontrole); Все еще их много утечки памяти. – ManjuVijayan

+0

Container.Children.Remove (oldusercontrole); его рабочий .. спасибо .. – ManjuVijayan

ответ

1

Во-первых, я должен отметить, что если вывоз мусора на самом деле не происходит (как вы сказали), это не ваша вина, и это делает не означает, что вы делаете что-то неправильно. Это означает, что CLR не думает, что ваша система еще находится под давлением памяти.

Теперь, чтобы вручную вызвать цикл сбора мусора, вы можете использовать статический метод GC.Collect(). Если сбор мусора действительно начинается и потребление памяти по-прежнему необоснованно велико, это означает, что вы, вероятно, делаете что-то неправильно: вы постоянно увеличиваете количество ненужных ссылок на объекты, и сборщик мусора не может безопасно собирать эти объекты. Это своего рода утечка памяти.

Насколько ваш код, то я думаю, что проблема в конце методы вы публикуемая:

Container.Children.Add(newusercontrole); 

Это, кажется, добавить новый объект (на каждом клике) для сбора Container.Children. Если это не удалено в другом месте, это, вероятно, является причиной утечки памяти. Я не знаю, какое подходящее решение для вашего случая использования (так как я не знаю точно, как должен себя вести пользовательский интерфейс), но вам, скорее всего, нужно будет найти способ удалить последний UserControle, добавленный с Container.Children. Если вы можете использовать LINQ, тогда методы OfType<T>() и Last() могут быть полезны для его поиска.

В любом случае не оставляйте строку GC.Collect() в производственном коде. Используйте его только для принудительного сбора цикла для целей тестирования, как этот.

+0

спасибо за ур ответ .. – ManjuVijayan

Смежные вопросы