Утилизация всех дочерних элементов управления и данных - C# - PullRequest
0 голосов
/ 13 января 2020

Я загружаю пользовательский элемент управления внутри панели, сам пользовательский элемент управления содержит так много внутренних элементов управления, как страницы вкладок, панели, кнопки, а также внутри его панелей будут некоторые другие пользовательские элементы управления.

Допустим, скажем Я загружаю основной пользовательский элемент управления внутри главной панели, если я использую это:

MainPanel.Controls.Clear();

Это не очистит память, поэтому я использую это вместо:

while (MainPanel.Controls.Count > 0) MainPanel.Controls[0].Dispose();

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

Кроме того, внутри пользовательского элемента управления есть несколько элементов управления сеткой, которые загружают некоторые данные. Они не привязаны к какой-либо базе данных, просто извлекают некоторые данные с помощью LINQ из базы данных и команды new. Нужно ли уничтожать эти данные перед удалением элемента управления, или они будут удалены из памяти с помощью удаления элемента управления?

1 Ответ

1 голос
/ 13 января 2020

https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/unmanaged?view=netframework-4.8

Вызовите Dispose, когда вы закончите использовать Компонент. Метод Dispose оставляет Компонент в непригодном для использования состоянии. После вызова Dispose вы должны освободить все ссылки на Компонент, чтобы сборщик мусора мог освободить память, которую Компонент занимал. Для получения дополнительной информации см. Очистка неуправляемых ресурсов и Реализация метода удаления.

for (int i = MainPanel.Controls.Count - 1; i >= 0; i--) { 
    MainPanel.Controls[i].Dispose();
}

Вам не нужно разыменовывать любые другие данные. G c.

Только элементы управления, так что они могут быть подобраны. Имейте в виду, что если вы разыменовываете ControlA, у которого есть ObjectB, то ObjectB также разыменовывается и может быть выбран.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...