2009-01-31 3 views
2

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

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

Спасибо.

ответ

2

Если ваша реализация белая, то вызов Close on file stream должен закрыть ее поток памяти.

Если класс реализует IDisposable использовать только с помощью блока, если в C#, так что ресурс будет расположен:

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

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

+0

Как насчет того, будет ли код внутри блока использования исключать? – MichaelD

+0

Используя блок использования, вы гарантируете, что ресурс будет удален, даже если в блоке использования возникает исключение. – Llyle

+0

Используемый блок переводится компилятором в блок try..finally с вызовом foo.Dispose() в конце. Таким образом, компилятор гарантирует, что Dispose будет вызываться, даже если ваш код генерирует исключение. –

1

Следуйте этим правилам накатанной

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 - Оставьте все остальное на мусорной collecto г

0

Если вы можете положить их в использовании блоков:

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

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

1

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

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

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

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

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

Посмотрите этот earlier SO question гораздо более подробно

+0

Да, мне особенно интересно очистить свои собственные ссылки. – MichaelD

0

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

Смежные вопросы