Утечка ресурсов .NET Gotchas - PullRequest
13 голосов
/ 29 мая 2009

Существует несколько способов, которыми разработчики могут быть обнаружены непреднамеренными утечками ресурсов в .NET. Я подумал, что было бы полезно собрать их в одном месте.

Пожалуйста, добавьте свой ответ с одним ответом на каждый элемент, чтобы за него проголосовали:)

Ответы [ 17 ]

8 голосов
/ 29 мая 2009

Ошибка удаления обработчиков событий.

Регистрация на событие должна быть в паре с отменой регистрации:

   this.myObject.MyEvent += new EventHandler(myObject_MyEvent);
   this.myObject.MyEvent -= new EventHandler(myObject_MyEvent);

Существует пример системы, в которой это произошло на CodeProject .

7 голосов
/ 29 мая 2009

P / Вызывает неуправляемый код и не очищает его, или не реализует IDisposable для их очистки.

7 голосов
/ 29 мая 2009

Не используется Using.

6 голосов
/ 29 мая 2009

Оставлять соединения с базой данных открытыми.

4 голосов
/ 29 мая 2009

Объекты клиента WCF не работают как другие объекты IDisposable. Клиент службы WCF должен быть прерван, если операция находится в состоянии сбоя, иначе соединение будет оставаться открытым. Это обычно изучается трудным путем.

4 голосов
/ 29 мая 2009

Невыполнение реализации Утилизировать и не утилизировать дочерние объекты.

2 голосов
/ 29 мая 2009

Практически все при использовании API-интерфейсов Office. Поскольку все они являются объектами COM, они должны быть утилизированы. Вы также должны сохранить ссылку на класс, если хотите использовать обработчики событий, иначе они потеряют свою ссылку. Во многих случаях вам даже приходится вручную вызывать GC для очистки объектов

2 голосов
/ 29 мая 2009

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

Вы можете столкнуться с этим, если у вас есть что-то вроде списка или словаря слабых ссылок, которые вы никогда не удаляете. Вы будете в конечном итоге протекать объекты WeakReference даже после того, как цель была собрана.

2 голосов
/ 30 мая 2009

Легкая утечка памяти: создайте статическое поле в классе типа List. Добавить элементы в список. Они никогда не будут собирать мусор, поэтому, если вы не забудете вручную удалить свои элементы, когда закончите с ними, память постоянно связана.

1 голос
/ 29 мая 2009

Ошибка вызова метода «Закрыть» для объекта System.Windows.Window.

Единственный способ убедиться, что все управляемые ресурсы для объекта System.Windows.Window являются сборщиком мусора, - это вызвать метод Close () для объекта Window. Вызов Dispose или установка ссылки на объект на null не приведет к его уничтожению.

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