2016-12-23 7 views
-2

Относительно простая проблема.Как правильно удалить элемент управления из памяти, в VB.Net?

У меня есть панель с некоторыми текстовыми полями на ней, все динамически созданное. Пользователь заполняет некоторые текстовые поля, а затем переходит к закрытию панели.

Теперь в коде я использую линию;

Me.Pnl_Main.Controls.Clear() 

, и это прекрасно работает, содержимое панели «удалено».

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

И, к сожалению, для меня большая часть пользовательского интерфейса создается таким образом, что неизбежно приводит к утечке памяти.

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

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

+0

Я думаю, проблема в том, что ссылки на созданные вами текстовые поля все еще существуют где-то после выполнения '.Clear()'. Я не думаю, что у вас проблема с утечкой памяти, потому что вы всегда используете одни и те же экземпляры текстовых полей (почему вы видите предыдущий текст). Конечно, текстовые поля ссылаются вне формы, чем возможна утечка. Можете ли вы показать код, как вы создаете текстовые поля и добавляете их в панель – Fabio

+0

После 'Me.Pnl_Main.Controls.Clear()' вы можете установить переменную текстового поля в ничто. –

+0

Текстовые поля на самом деле являются частью пользовательского элемента управления, который я создал (таким образом я экономлю время при динамическом создании большого количества элементов управления). –

ответ

-1

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

Me.Pnl_Main.Controls = Nothing 

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

+0

Это буквально ничего не делает. Нет смысла устанавливать вещи в «Nothing» в VB.NET. Код в исходном вопросе был правильным, Боб должен называть «Очистить». Часть, которую он отсутствует, состоит в том, что ему нужно сначала пропустить каждый элемент управления в коллекции и вызвать его функцию 'Dispose'. Как только это будет сделано, он может вызвать 'Clear', чтобы очистить коллекцию. –

+0

См. Этот вопрос, и те, которые он связывает: http://stackoverflow.com/questions/1969705/clear-controls-does-not-dispose-them-what-is-the-risk –

-1

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

+0

Это своего рода истина, своего рода нет.Вызов Dispose не имеет ничего общего с сборщиком мусора; он выпускает * неуправляемую * память, в то время как сборщик мусора имеет дело с управляемой памятью. Поэтому вызов Dispose * является критически важным для предотвращения утечки памяти. Если тип реализует IDisposable, вы * должны * вызывать метод Dispose, или вы будете течь. Класс Control еще более особенный (подробнее см. Дубликат). Вы абсолютно * должны * вызывать метод Dispose для каждого элемента управления, который вы динамически удаляете из своего родителя. Способ правильного ответа будет заключаться в том, чтобы заменить «disposed» на «unreferenced». –

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

  • Нет связанных вопросов^_^