Можно ли использовать метод FromStream System.Drawing.Image без необходимости держать поток открытым в течение всего времени жизни изображения?
У меня есть приложение, которое загружает кучу графики панели инструментов из файлов ресурсов, используя комбинацию Image.FromStream
и Assembly.GetManifestResourceStream
.
Проблема, с которой я столкнулся, заключается в том, что в Windows 7 это работает нормально, в Windows XP происходит сбой приложения, если элемент пользовательского интерфейса, связанный с одним из этих изображений, отключен. В Windows 7 изображение отображается в оттенках серого. В XP происходит сбой при исключении нехватки памяти.
После большой нагрузки я наконец-то проследил ее до начальной загрузки изображения. Разумеется, если я создаю какой-либо объект, реализующий IDisposable
, который также уничтожается тем же методом, я обертываю его в операторе using, например
using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName))
{
image = Image.FromStream(resourceStream);
}
Если я удаляю оператор using, чтобы поток не удалялся, тогда приложение больше не падает на XP. Но теперь у меня есть куча «бесхозных» потоков - изображения хранятся в командных классах, и они корректно распределяют изображения, когда они сами располагаются, а исходный поток - нет.
Я проверил документацию для FromStream
, и это подтверждает, что поток должен оставаться открытым. Почему это не сработало и не сгорело в системе разработки Windows 7 - загадка!
Я действительно не хочу, чтобы этот поток слонялся поблизости, и я, конечно, не хочу хранить ссылку на этот поток, а также изображение, чтобы я мог утилизировать его позже. Мне нужен этот поток только один раз, поэтому я хочу избавиться от него:)
Можно ли тут же создать образ и затем убить поток?