È possibile utilizzare il metodo FromStream di System.Drawing.Image senza dover mantenere aperto lo stream per la durata dell'immagine?Caricamento di un'immagine da uno streaming senza tenere aperto lo stream
Possiedo un'applicazione che carica una serie di elementi grafici della barra degli strumenti dai file di risorse, utilizzando una combinazione di Image.FromStream
e Assembly.GetManifestResourceStream
.
Il problema che sto avendo è mentre questo funziona bene su Windows 7, Windows XP l'applicazione si blocca se un elemento dell'interfaccia utente collegato a una di queste immagini è disabilitata. Su Windows 7, l'immagine è resa in scala di grigi. Su XP, si blocca con un'eccezione di memoria insufficiente.
Dopo un carico di hairpulling l'ho finalmente tracciato al caricamento iniziale dell'immagine. Come una cosa ovvia, se creo qualsiasi oggetto che implementi IDisposable
che è anche distrutto nello stesso metodo, avvolgo in un'istruzione using, per esempio
using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName))
{
image = Image.FromStream(resourceStream);
}
Se rimuovo l'istruzione using modo che il flusso isn 'disposed, quindi l'applicazione non si blocca più su XP. Ma ora ho un mucchio di flussi "orfani" che si aggirano - le immagini sono archiviate in classi di comando e queste correttamente dispongono delle immagini quando sono disposte, ma il flusso originale non lo è.
ho controllato la documentazione per FromStream
e conferma il flusso deve rimanere aperta. Perché questo non è andato in crash e bruciato sul sistema di sviluppo di Windows 7 è comunque un mistero!
Io davvero non voglio che questo flusso vada in giro, e certamente non voglio dover memorizzare un riferimento a questo stream così come l'immagine in modo che io possa disporre di esso in seguito. Ho solo bisogno di quel flusso una volta così voglio liberarmene :)
È possibile creare l'immagine e quindi uccidere il flusso lì e poi?
A modo, un 'OutOfMemoryException' in' System.Drawing' ususally significa * errore generico * in GDI +. Il motivo è [storico] (http://stackoverflow.com/questions/2610416/is-there-a-reason-image-fromfile-throws-an-outofmemoryexception-for-an-invalid-im) ed è dovuto alla mappatura dei codici di errore non gestiti. –
Se il flusso che si passa a Image.FromStream non è ricercabile, è possibile chiudere il flusso in modo sicuro. Ma questo è un comportamento non documentato, quindi usalo a tuo rischio. – user2452157