Как перезагрузить элементы управления после их утилизации / удаления - PullRequest
0 голосов
/ 14 октября 2011

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

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

Однако каждый раз, когда япереключитесь через кнопку и снова вызовите InitializeComponent, использование VRAM будет устойчиво увеличиваться, вероятно, потому, что оно действительно не «убивает» все предыдущие ресурсы с помощью dispose.

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

Заранее спасибо.

РЕДАКТИРОВАТЬ: ааа, неважно, я понял.

вместо .dispose Я просто используюControls.Remove команда для удаления текущего набора элементов управления при переходе на страницу2. Если я хочу вернуться назад, я теперь могу просто использовать команду Controls.Add, чтобы снова просмотреть первый набор элементов управления, и использование VRAM не увеличивается.

Это было невозможно при утилизации, любой желающий можетобъяснить, что?Я НАСТОЯЩИЙ новичок в csharp, в основном начался несколько дней назад.

Ответы [ 2 ]

1 голос
/ 14 октября 2011

На самом деле вы не должны вызывать Dispose () самостоятельно.Обычно фреймворк сделает это за вас, когда вы вызываете Close () в форме и тому подобное.По-видимому, это не всегда приводит к удалению соответствующего элемента, если на него все еще есть ссылки.Это причина, по которой ваши элементы управления остаются в пути.

Если вам (по какой-то причине) необходимо закрыть () или удалить () и элемент, для которого вы сохраняете ссылку, вы должны сделать элемент. IsDisposedпроверьте, прежде чем делать что-либо еще.Если это правда, вы должны создать его заново, потому что элемент уже наполовину мертв.Нет некромантии, пожалуйста: -)

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

Вызов Dispose для любого одноразового объекта должен привести к тому, что он освободит (установит ссылки на null) любые ссылочные одноразовые объекты и очистит любые неуправляемые ресурсы, на которые имеются прямые ссылки. В случае использования элементов управления UI освобождаются неуправляемые базовые объекты Win32 GUI. Dispose - это , а не об освобождении памяти для повторного использования, это делается сборщиком мусора, когда на объекты не ссылаются (косвенно) какая-либо статическая или стековая (локальная) ссылка. Если вы сохраняете ссылку на последнюю страницу (чтобы вернуться к ней), тогда на элементы управления в ее коллекции Controls все равно будут ссылаться и сохранять их живыми.

Даже если они удалены из коллекции элементов управления и в противном случае не имеют ссылок, поскольку элементы управления пользовательского интерфейса, как правило, существуют какое-то время, вполне вероятно, что они перешли из нулевого поколения (часто собираются) в поколение 1 или даже 2 (собираются редко) , Если не будет проблем с памятью (в вашей системе недостаточно свободной памяти), их сбор может занять много времени.

Вы можете демонстатировать это, используя WinDbg с расширениями SOS, чтобы посмотреть, какие объекты относятся к конкретному поколению (или даже перечислить все объекты этого поколения), или принудительно создав полную коллекцию.

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

...