asp.net лучший способ убрать неуправляемые ресурсы - PullRequest
0 голосов
/ 15 февраля 2012

Я немного озадачен очисткой памяти в приложении ASP.NET. Я определил несколько деструкторов - я знаю, что это не новый способ работы в .NET, но я - привычка, и я всегда делал это таким образом в c ++ - которые прекрасно работали практически в каждом сценарии. Однако я заметил, что они иногда не вызываются в моих приложениях ASP.NET.

Я думаю о реализации IDisposable, но у меня сложилось впечатление, что IDisposable предназначен для других пользователей вашего кода, и я не уверен, что ASP.NET вызовет Dispose, когда он завершит работу с объектом. Может ли кто-нибудь уточнить это?

Что является лучшим, и под лучшим я подразумеваю, что оно всегда будет работать - способ очистить мою неуправляемую память?

Редактировать

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

Ответы [ 2 ]

3 голосов
/ 15 февраля 2012

Все классы, которые обрабатывают неуправляемые ресурсы, должны реализовывать IDisposable интерфейс .

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

Следовательно, от вызывающего кода зависит dispose объектов, которые используют неуправляемые ресурсы.Лучший способ сделать это - реализовать описанный выше интерфейс и либо обернуть объект в с помощью оператора () {} , либо, по крайней мере, попробовать ... наконец.Я обычно предпочитаю использовать оператор.

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

1 голос
/ 15 февраля 2012

При работе с управляемыми ресурсами вам не нужно реализовывать IDisposable или деструктор.Все, что вам нужно сделать для «очистки» - это установить все ссылки верхнего уровня («укорененные») в null (статика обычно считается верхним уровнем), а сборщик мусора позаботится обо всем остальном.

Деструкторы как таковые в первую очередь полезны с неуправляемыми ресурсами в тех случаях, когда вызывающие абоненты либо забывают вызвать Dispose, либо когда такой вызов невозможен.Однако среда выполнения не гарантирует, что деструкторы когда-либо будут вызваны;только то, что они будут вызваны до того, как память, связанная с объектом, будет окончательно освобождена.Вам не нужно реализовывать IDisposable;это просто соглашение.Вполне разумно иметь метод Close () или Cleanup (), который освобождает неуправляемые ресурсы.

...