System.Drawing и сборка мусора - PullRequest
       3

System.Drawing и сборка мусора

3 голосов
/ 05 августа 2010

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

Сейчас я просматриваю свой код для миниатюры и хотел бы получить совет о том, когда что-то действительно нужно удалить, ТОЛЬКО когда вы создаете новый экземпляр объекта?

Нравится:

Target := System.Drawing.Bitmap.Create(Trunc(Width), Trunc(Height));
MyImage := Target.FromFile(PhotoPath);

Итак, мой вопрос: нужно ли мне утилизировать и Target, и MyImage, чтобы убедиться, что GC делает то, что ему нужно делать правильно?

Спасибо.

Ответы [ 5 ]

6 голосов
/ 05 августа 2010

Прочтите этот пост в блоге на MSDN: Утечка памяти в .NET: утилизировать или не утилизировать, это вопрос 1 ГБ . Похоже, что вы должны утилизировать.

4 голосов
/ 05 августа 2010

Как общая политика, я бы поставил вопрос с ног на голову:

Есть ли причина, по которой я не должен избавляться от этих конкретных предметов

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

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

Хорошо, позвольте мне уточнить, что я здесь сказал.

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

Если вам дали объект, предположите, что он не ваш, если только вы не требуете, чтобы объект был отдан, а не просто временно передан вам.

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

2 голосов
/ 05 августа 2010

Да, оба вызова приводят к созданию новых Bitmap объектов, поэтому вам нужно избавиться от них, когда вы закончите с ними.

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

2 голосов
/ 05 августа 2010

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

1 голос
/ 05 августа 2010

Да , Удалите созданные вами IDisposables. Конечно в GDI +

Предпочтительно в блоке using() {}.

using (Pen p = new Pen(Colors.Blue))  // Dispose this pen
{
    Brush b = Brushes.Green; // but not this Brush
    ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...