Растровый класс не располагает потоком? - PullRequest
9 голосов
/ 25 мая 2011

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

Глядя на исходный код, классы Bitmap и Image создают экземпляр GPStream для переноса потока, но не хранит ссылку ни на GPStream, ни на экземпляр Stream .

num = SafeNativeMethods.Gdip.GdipLoadImageFromStreamICM(new GPStream(stream), out zero);

Теперь класс GPStream (внутренний) не реализует метод Release или Dispose - ничего, что позволило бы GDI закрыть или утилизировать поток. А поскольку класс Image / Bitmap не сохраняет ссылку на экземпляр GPStream, кажется, , что у GDI, Drawing.Bitmap или Drawing.Stream нет абсолютно никакого способа правильно закрыть поток.

Я мог бы создать подкласс Bitmap, чтобы исправить это, но, о, подождите, он запечатан .

Пожалуйста, скажите мне, что я неправ, и что MS не просто сделала невозможным написание кода, который не пропускает ресурсы с их API.

Имейте в виду (а), растровое изображение имеет нет управляемой ссылки на поток, что означает, что GC будет собирать его, пока он еще используется, и (б) API .NET принимают ссылки на битовые карты / изображения и не являются детерминированными, когда они закончили с ними.

Ответы [ 3 ]

8 голосов
/ 25 мая 2011

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

3 голосов
/ 25 мая 2011

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

0 голосов
/ 25 мая 2011

Поскольку растровое изображение не может гарантировать, в каком порядке вызывается деструктор, он не закроет поток, поскольку он, возможно, уже был закрыт собственным деструктором во время сбора мусора.CLR Джеффри Рихтера через C # имеет главу об управлении памятью, которая объясняет с большей ясностью, чем я.

...