Если я заменю изображение в элементе управления PictureBox, я должен сначала избавиться от исходного изображения? .Net Winforms - PullRequest
8 голосов
/ 10 апреля 2010

Исходя из мой вопрос здесь , если я заменю изображение в графическом окне, я должен сначала утилизировать оригинальное изображение?

Или как насчет этой ситуации:

Dim bm As New Bitmap(32,32)  
bm = New Bitmap(32,32)  
bm = New Bitmap(32,32)  
bm = New Bitmap(32,32)  

Нужно ли уничтожать bm только в конце или перед каждым повторным созданием?


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

Ответы [ 4 ]

5 голосов
/ 10 апреля 2010

Да, вы должны удалить старый объект, прежде чем создавать новое изображение поверх той же переменной. Создавая новое изображение с той же переменной, вы удаляете ссылку на него. Если нет ссылок на старый объект, вы указываете, что он должен быть собран GC (сборщик мусора). Хотя технически это «должно» в конечном итоге привести к освобождению памяти, если предположить, что финализатор позаботится о том, чтобы о неуправляемых ресурсах позаботились, это большое предположение (вы даже не можете предположить, что финализатор будет вызываться) , и это вызывает больше работы для системы. Финализаторы не по умолчанию вызывают дополнительную работу для GC с точки зрения повышения уровня сборки мусора, в результате чего требуется больше времени для освобождения памяти, а также количество раз, которое GC должен выполнить для этого.

Предполагается, что все написано, чтобы убедиться, что финализатор обработает его. Каждый раз, когда объект имеет метод Dispose (все, что реализует IDisposable, что делает BitMap), его следует вызывать перед удалением ссылки на объект (выпадение из области видимости, удаление ссылки на объект и т. Д.).

Вот статья о том, как работает сборщик мусора в .net

http://www.devx.com/dotnet/Article/33167

Вот как MS говорит, что dispose / finalizer должен быть реализован:

http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx

3 голосов
/ 25 июля 2012

При изменении изображения, связанного с PictureBox, следует вызвать Dispose на изображении, которое было там, если и только если больше ничего не будет использовать это изображение. Чтобы узнать это, нужно знать, откуда появилось старое изображение. В некоторых случаях изображение будет создано только с целью присвоения PictureBox. В других случаях изображение может быть тем, которое предназначено для совместного использования и / или повторного использования. Если изображение было создано исключительно с целью присвоения PictureBox, оно должно быть Dispose d, если PictureBox удален или ему дано другое изображение. Если предполагается, что изображение будет передано или использовано повторно, такие условия не должны приводить к его удалению.

Правильный способ решения таких проблем в целом заключается в том, чтобы классы, имеющие свойства IDisposable (например, PictureBox, с Image), использовали явный метод SetImage вместо использования изменяемого свойства Image и для метода SetImage включить параметр, указывающий, должен ли PictureBox взять на себя ответственность за его удаление. Вызов SetImage или Dispose на PictureBox должен вызвать Dispose на удерживаемом изображении, если и только если предыдущий вызов SetImage дал ему такую ​​ответственность. К сожалению, PictureBox не работает таким образом, но я настоятельно рекомендую использовать его в качестве шаблона для будущих классов, которые вы пишете, которые содержат IDisposable объекты.

2 голосов
/ 10 апреля 2010

Нужно ли располагать bm только в конце или перед каждым повторным созданием?

Следует утилизировать перед каждым «отдыхом». Не путайте объект со ссылкой на объект. «Новое растровое изображение» создает новый объект. «bm» - это ссылка, которая указывает на этот объект. Они не то же самое. Вы не «воссоздаете» здесь какой-либо объект - вы создаете новый объект, а затем отбрасываете все ссылки на предыдущий объект, что означает, что я буду собирать мусор через некоторое время в (ближайшем) будущем.

2 голосов
/ 10 апреля 2010

Да, вы должны. Он реализует IDisposable.
Как общее правило, располагайте все объекты, которые реализуют IDisposable. Не оставляйте это GC.

...