Как лучше всего очистить ресурсы для приложения .NET? - PullRequest
2 голосов
/ 31 января 2009

Каков наилучший способ или метод наилучшей практики для обеспечения того, чтобы приложение Winforms .NET высвобождало все ресурсы, которые оно использовало в жизненном цикле своего выполнения?

В частности, выпуск файловых дескрипторов и изображений.

Спасибо.

Ответы [ 5 ]

2 голосов
/ 31 января 2009

Если ваша реализация помещена в «белый ящик», то вызов Close для файлового потока должен закрыть его поток памяти.

Если класс реализует IDisposable, просто используйте блок using в C #, чтобы ресурс был расположен:

using (var foo = new Foo())
{
    // Do some stuff to foo
}

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

1 голос
/ 31 января 2009

Если вы пишете класс, имеющий ссылку на файлы / изображения, вы несете ответственность за обеспечение механизма их выпуска.

Для всех приложений .NET (не только для WinForms) реализация IDisposable для любого типа, содержащего ссылки на большие ресурсы файлов / памяти, всегда является хорошим началом.

Если вы используете типы фреймворков, которые обращаются к ресурсам, то, как говорили другие, блоки использования - это элегантное решение.

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

Наконец, поскольку фактически вызов Dispose (напрямую или через использование) выполняется пользователем ваших типов, необходимо четко документировать это (XML-комментарии и т. Д.).

См. Этот ранее SO вопрос для более подробной информации

1 голос
/ 31 января 2009

Следуйте этим правилам большого пальца

1 - По возможности используйте функцию, чтобы убедиться, что объекты правильно расположены (особенно при работе с потоками и т. Д.). Вы можете применить «использование» для удаления любого IDisposable

using (SteramReader reader=new StreamReader(filePath)) 
{
     //Do your stuff here
}

Когда вы утилизируете потоки, Close вызывается автоматически.


2 - Если вы не используете управляемые компоненты, убедитесь, что вы их очищаете при утилизации объектов или закрытии форм


3 - Если вы используете слишком много сериализации XML, убедитесь, что вы используете правильные конструкторы, в противном случае это может вызвать утечку памяти - http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx


4 - Оставьте все остальное сборщику мусора

0 голосов
/ 31 января 2009

1. -Внедрение интерфейса IDisposable поможет вам с неуправляемыми ресурсами. 2.- если вы программно обращаетесь к файлам в случае ошибки, попробуйте закрыть () файлы или потоки в операторе try {} catch {} finally, чтобы избежать блокировок этого ресурса. 3. Сборщик мусора большую часть времени забирает ресурсы

0 голосов
/ 31 января 2009

Если можете, поместите их в блоки:

using(Bitmap bitmap = new Bitmap(path)) {
    ...
}

Тогда ресурсы растрового изображения будут гарантированно высвобождены в конце использования блока. В противном случае используйте шаблон Dispose: http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

...