Image.FromStream не содержит ссылки на основной поток - PullRequest
3 голосов
/ 26 февраля 2010

У меня есть код, который делает

MemoryStream ms = new MemoryStream();
...
return Image.FromStream(ms);

Сбой очень эклектичным способом, поскольку объект Image не содержит ссылку на поток, поэтому он может быть удален, если GC ударит, что приведет к ошибкам GDI +.

Как мне обойти это (не сохраняя поток на диск или не изменяя мои методы sigs)?

Ответы [ 2 ]

1 голос
/ 26 февраля 2010

Для меня это маловероятно - это может вызвать проблемы при любом использовании Image.FromStream.

Мне кажется более вероятным, что что-то избавляет от вашего MemoryStream, чего не должно быть.

Не могли бы вы предоставить короткую, но полную программу, которая демонстрирует проблему? Принудительная сборка мусора должна сделать его относительно простым для воспроизведения - вы даже можете создать свой собственный класс, производный от MemoryStream с помощью финализатора, чтобы показать, действительно ли он собирается (ну, по крайней мере, завершен).

1 голос
/ 26 февраля 2010

Нет способа сделать это, не немного изменив свой код. Раздел Замечания для документации по статическому методу FromStream для состояний класса Image :

Вы должны держать поток открытым для время жизни изображения.

При этом вы должны убедиться, что, когда изображение обращается к потоку, поток открыт. Также может показаться (просматривая Reflector), что метод FromImage фактически не заставляет экземпляр Image удерживать ссылку на поток, из которого было загружено изображение.

При этом вы должны каким-то образом связать изображение и MemoryStream (или Stream) вместе, чтобы оно не получало GCed. Если на самом деле не сохраняется «владение» изображением (оно передается), я рекомендую создать структуру данных, которая будет содержать ссылку на изображение и поток и передавать их в тандеме. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...