Уничтожить контроль - PullRequest
       1

Уничтожить контроль

4 голосов
/ 13 ноября 2010

Я использую цикл for для генерации некоторых элементов управления.Каждый элемент управления представляет особую визуализацию.Я не могу использовать элементы управления вроде ListBox или что-то подобное.Я должен использовать свой подход.Сгенерированные элементы управления размещены в Canvas.Через некоторое время некоторые элементы управления больше не нужны.Некоторые элементы управления должны быть удалены.Я могу вручную удалить элементы управления через

c.Children.Remove( ... );

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

Проблема в том, что я генерирую данные в тоннах!: -)

Ответы [ 5 ]

4 голосов
/ 13 ноября 2010

В зависимости от того, какой элемент управления вы используете, может потребоваться вызвать Control.Dispose(), чтобы освободить все ресурсы.Будьте осторожны, если вы используете неуправляемые ресурсы (Подробнее)

Я думаю, что это не ваш случай.

Тогда сборщик мусора будет собирать объект для вас.

Кроме того, эта статья о том, как работает сборщик мусора, может быть очень интересной:

http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspx

4 голосов
/ 13 ноября 2010

Таким образом, если вы вызываете Уничтожить элемент управления, и вы не сохранили никаких других ссылок на элемент управления в памяти (например, в хэш-таблице элементов управления или чего-то еще), то GC соберет его.

Не пытайтесь заставить .NET GC делать что-то причудливое, пусть он выполняет свою работу в свое время, как ее разработали авторы библиотеки.Если вы Destroy это сделаете, то в свое время он исчезнет.

И наконец, если вы обеспокоены тем, что он все еще потребляет память, настало время начать профилирование вашего кода, как, например, с RedGate.Муравьи.

2 голосов
/ 13 ноября 2010

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

1 голос
/ 14 ноября 2010

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

Но вы должны быть осторожны с обработчиками событий. Если объект A подписывается на событие, которое вызывает объект B, объект B содержит ссылку на объект A. Если ваши элементы управления подписываются, скажем, на Canvas.IsEnabledChanged, вы можете удалить их из Canvas, но Canvas все равно будет храните ссылку на них, чтобы они могли уведомлять их об изменениях IsEnabled, и они не будут собирать мусор. Это самая распространенная причина «утечек памяти» в приложениях .NET. (Они на самом деле не утечки памяти, но они могли бы быть.)

1 голос
/ 13 ноября 2010

если вы уверены, что на объекты больше не ссылаются, вы можете принудительно вызвать сборщик мусора с помощью gc.Collect ()

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