Попытка заменить Controls.Clear (), чтобы избежать утечки памяти, не работает - почему? - PullRequest
0 голосов
/ 10 октября 2011

Я заменил:

panel.Controls.Clear();

на:

Clear(panel);

Где:

public static void Clear(Control ctrl)
{
    while (ctrl.Controls.Count > 0) ctrl.Controls[0].Dispose();
}

И я получаю следующую ошибку: при Application.Run(new Form1()); Система.ObjectDisposedException не обработан. Не удается получить доступ к удаленному объекту.Имя объекта: «Метка».

Любая идея, почему это может быть?

Спасибо.

РЕДАКТИРОВАТЬ: См. Как очистить () элементы управления, не вызывая памятиутечка

РЕДАКТИРОВАТЬ: Извините, я, вероятно, избавиться от чего-то, что я просто хочу удалить из его родителя.Я проверю это.Спасибо за ответы.

Ответы [ 3 ]

3 голосов
/ 10 октября 2011

Dispose() не имеет ничего общего с памятью при нормальных обстоятельствах.Он не освобождает память, не удаляет объект из коллекции и не вызывает сборщик мусора.Вместо этого цель .Dispose() состоит в том, чтобы очистить ресурсы не-памяти : подключения к базе данных, сокеты, дескрипторы устройств, дескрипторы gdi и т. Д.исправить проблему с памятью, если вы используете пользовательские элементы управления, каждый из которых полагается на код в неуправляемой (не .Net) dll.

0 голосов
/ 18 июня 2012

Я, вероятно, избавился от некоторых Control s, которые я использовал позже в коде.

0 голосов
/ 10 октября 2011

Вам нужно удалить расположенные вами элементы управления, но может быть лучше:

public static void Clear(Control ctrl)
{
    foreach(Control c in ctrl.Controls) c.Dispose();
    ctrl.Controls.Clear();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...