Как очистить память, используемую многими пользовательскими элементами управления - PullRequest
0 голосов
/ 15 августа 2011

У меня есть много пользовательских элементов управления, в которых я добавляю только один из них на панель, но сначала очищаю панель от предыдущего.

Я создаю новый экземпляр пользовательского элемента управления, когда хочу добавить его на панель, и Dispose() других пользовательских элементов управления и задаю для всех ссылок значение null, чтобы сборщик мусора мог их удалить.

Например:

// Declare the variables globally
ViewBasicInformation control1 = null;
AddBasicInformation control2 = null;

// Code inside Button
Panel.Controls.Clear(); 
control1.Dispose(); 
control1 = null;
control2 = new AddBasicInformation();  
Panel.Controls.Add(control2);

Однако, как увеличивается использование памяти, как мне освободить эту память?

И для получения дополнительной информации ... Каждый пользовательский элемент управления использует класс, который устанавливает соединение со смарт-картой и выполняет некоторые команды для чтения и записи на карту.

У меня также есть фоновый работник, который определяет, когда карта вставлена ​​или извлечена.

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Среда выполнения .NET использует сборку мусора - я настоятельно призываю вас не управлять памятью самостоятельно.

Я бы ожидал, что память изначально увеличится - если она никогда не выйдет из строя, у вас будет зависаниессылки где-то.Скорее всего, вы подписываетесь на события, и когда подписанные объекты больше не нужны, вы не отмените подписку на эти события.Это наиболее распространенная причина утечек памяти в приложениях .NET (хотя работа с неуправляемым кодом занимает второе место).

Убедитесь, что вы отменили подписку на любое управляющее событие, на которое вы подписались, прежде чем очистить ссылкук этому.

0 голосов
/ 15 августа 2011

Независимо от того, является ли сборщик мусора достаточно умным в отношении того, когда он должен работать, а когда нет необходимости, существует ряд источников ошибок, в которых вы эффективно попадаете в утечки памяти, основанные на обработке событий и различном времени жизни объектов.,Раньше это было предметом SO (например, здесь ), и я немного написал о некоторых ошибках, которые мы допустили в одном проекте, который стал причиной утечек памяти здесь: Как вы думаете, ваша WindowsПриложение .Forms не имеет утечек памяти?

...