Alcune informazioni di base su questo comportamento: Bitmap utilizza un file mappato in memoria per accedere ai pixel nella bitmap. Questa è una funzionalità molto semplice nell'API di Windows, consente una mappatura della memoria molto efficiente ai dati dei file. I dati vengono letti dal file solo quando il programma legge la memoria, le pagine di memoria virtuale non occupano spazio nel file di paging di Windows.
Lo stesso meccanismo viene utilizzato per caricare gli assembly .NET. È la mappatura della memoria che mette un blocco sul file. Il che è fondamentalmente il motivo per cui gli assembly vengono bloccati quando vengono utilizzati in un programma .NET. Il metodo Image.Dispose() rilascia il blocco. Combattere il lucchetto spesso indica che ti stai dimenticando di disporre le tue bitmap. Molto importante, dimenticarsi di chiamare Dispose() non causa spesso problemi per le classi .NET, tranne Bitmap, dal momento che può richiedere così tanta memoria (non gestita).
Sì, FromStream() impedisce alla classe di eseguire questa ottimizzazione. Il costo è significativo, è necessario raddoppiare la memoria quando viene caricata la bitmap. Questo sarà un problema quando la bitmap è grande, stai passando OOM quando il programma è in esecuzione da un po '(frammentando lo spazio degli indirizzi) e non è in esecuzione su un sistema operativo a 64 bit. Evita decisamente questo se la larghezza della bitmap x Altezza x 4> = 45 MB, dare o avere.
del codice, non si deve saltare attraverso il cerchio CopyStream:
public static Image LoadImageNoLock(string path) {
var ms = new MemoryStream(File.ReadAllBytes(path)); // Don't use using!!
return Image.FromStream(ms);
}
Nota che non si vuole eliminare il MemoryStream, si otterrà un difficile da diagnosticare "errore generico" quando la bitmap viene usata se lo fai. Causato dalla classe Image che legge il flusso in modo lazy.
fonte
2010-08-02 15:18:37
Anche questo è necessario per ottenere la bitmap. Bitmap bitmap = new Bitmap (LoadImageNoLock (path)); – Harris
MemoryStream è Usa e getta, chi si occuperà di eliminarlo in questa soluzione? – kwesolowski