Czy możliwe jest użycie metody FromStream z System.Drawing.Image bez konieczności utrzymywania strumienia otwartego przez cały okres istnienia obrazu?Ładowanie obrazu ze strumienia bez utrzymywania strumienia otwartego
Mam aplikację, która ładuje kilka grafik paska narzędzi z plików zasobów, używając kombinacji Image.FromStream
i Assembly.GetManifestResourceStream
.
Problem, który mam, podczas gdy to działa poprawnie w systemie Windows 7, w systemie Windows XP aplikacja ulega awarii, jeśli element interfejsu użytkownika połączony z jednym z tych obrazów jest wyłączony. W systemie Windows 7 obraz jest renderowany w skali szarości. W przypadku XP zawiesza się z wyjątkiem braku pamięci.
Po obciążeniu włosów w końcu wyśledziłem je do początkowego załadowania obrazu. W gruncie oczywiście, jeśli utworzyć dowolny obiekt wykonawczych IDisposable
który jest również zniszczone w taki sam sposób, ja owinąć go w użyciu instrukcji, na przykład
using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName))
{
image = Image.FromStream(resourceStream);
}
Jeśli usunąć za pomocą komunikatu tak, że ISN strumień zlikwidowane, aplikacja nie zawiesza się już na XP. Ale teraz mam w zanadrzu masę "osieroconych" strumieni - obrazy są przechowywane w klasach poleceń, a te poprawnie usuwają obrazy, gdy same się pozbywają, ale oryginalny strumień nie jest.
Sprawdziłem dokumentację pod kątem FromStream
i potwierdziłem, że strumień musi pozostać otwarty. Dlaczego to nie rozbił się i spalił na systemie Windows 7 rozwoju jest tajemnicą jednak!
Naprawdę nie chcę, żeby ten strumień kręcił się w pobliżu, a ja na pewno nie chcę przechowywać odniesienia do tego strumienia, jak również obrazu, aby móc go później usunąć. Potrzebuję tego strumienia tylko raz, więc chcę się go pozbyć :)
Czy jest możliwe utworzenie obrazu, a następnie zabicie tam i potem strumienia?
Przez sposób, 'OutOfMemoryException' w' System.Drawing' zwykle oznacza * ogólny błąd * w GDI +. Powodem tego jest [historyczny] (http://stackoverflow.com/questions/2610416/is-there-a-reason-image-fromfile-throws-an-outofmemoryexception- for-an-invalid-im) i jest należny do mapowania niezarządzanych kodów błędów. –
Jeśli strumień przesyłany do Image.FromStream nie jest dostępny, można bezpiecznie zamknąć strumień. Jest to jednak nieudokumentowane zachowanie, więc korzystaj z niego na własne ryzyko. – user2452157