Итак, обнаружив , что класс 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 принимают ссылки на битовые карты / изображения и не являются детерминированными, когда они закончили с ними.