![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| LamerTM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
Не получается удалить объект.
На форме кнопка и объект RichTextBox. Код такой:
При нажатии на кнопку создается объект с таймером, который периодически пишет в richTextBox1, чем и показывает своё присутствие в памяти. По идее, при создании нового объекта, предыдущий должен уничтожаться сборщиком мусора (по крайней мере так пишут на сайте майкрософт). У меня так не происходит и предыдущий объект не уничтожается, хотя ссылка на него вроде как теряется. Это видно после нескольких нажатий на кнопку. Созданные ранее объекты продолжают писать свои строки в richTextBox. GC.Collect() не помогло. |
|||
|
||||
| Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 5 Всего: 9 |
Добавлено через 5 минут и 45 секунд ИМХО мусорщик не убирает созданные объекты поскольку таймер остался включен и к ним обращается. |
|||
|
||||
| LamerTM |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
О, не успел. Уже нашел решение на msdn. Хотел написать что проблема решена. Ну все равно спасибо.
|
|||
|
||||
| Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 5 Всего: 9 |
а как решена?
|
|||
|
||||
| LamerTM |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
Абсолютно также.
Об этом сказано в описании таймера: http://msdn.microsoft.com/ru-ru/library/sy...ding.timer.aspx Там еще что-то написано из того чего я не делал, а вроде надо было, но я пока не вникал. Еще в класс добавил большой массив, чтобы по диспетчеру задач видеть как освобождается память (чтобы убедиться что не только таймер останавливается по Dispose, но и объект удаляется) |
||||
|
|||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Лучше уж тогда сам WTC сделать Disposable. http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx Выставление в null и Dispose вообще-то не удаляет объект, и не освобождает память. Сборщик мусора - недетерменированный механизм, он может в тот же момент, а может вообще не собрать до завершения приложения. |
|||
|
||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
Получается в .NET любой вызов уничтожения объекта или приведение его в null лишь попытка обратить внимание сборщика мусора, то есть не единовременное освобождение? |
|||
|
||||
| Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 5 Всего: 9 |
ИМХО нужно соблюдение условий - на объект нет действующих ссылок, его диспозят, других свободных ресурсов нет = железобетонно в мусор.
|
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Отсутствие ссылок на объект - это лишь необходимое условие для освобождения памяти. Само особождение произойдет в какой-то неопределенный момент. Где-то дальше в коде ты попытаешься создать какой-то новый объект. При попытке выделения памяти под него GC может решить что неплохо бы собрать мусор в 0-ом поколении. Построик список достижимых объектов. Все достижимые в 0-ом поколении переложит поплотнее в памяти, тем самым "собрав" недостижимые объекты. Потом, если освободится маловато памяти, он соберет 1-е поколение. Потом, если после сборки 1-го, и если все еще мало памяти - то соберет 2-е. Чем больше объект живет, тем больше у него шансов пережить сборки 0-го и 1-го и перейти во 2-е поколение. 2-е поколение собирается очень редко. Таймер в примере выше живет достаточно долго, и с большой вероятностью попадет в 1 или 2-е поколение. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |