Información básica sobre este comportamiento: Bitmap utiliza un archivo mapeado en memoria para acceder a los píxeles en el mapa de bits. Esa es una facilidad muy básica en la API de Windows, permite un mapeo muy eficiente de la memoria a los datos de archivo. Los datos se leen del archivo solo cuando el programa lee la memoria, las páginas de memoria virtual no ocupan ningún espacio en el archivo de paginación de Windows.
El mismo mecanismo exacto se usa para cargar ensamblajes .NET. Es la asignación de memoria que pone un bloqueo en el archivo. Que es básicamente por qué los ensamblados están bloqueados cuando se usan en un programa .NET. El método Image.Dispose() libera el bloqueo. Combatir el bloqueo a menudo indica que te estás olvidando de tirar tus mapas de bits. Muy importante, olvidarse de llamar a Dispose() no suele causar problemas para las clases .NET, excepto para Bitmap, ya que puede necesitar tanta memoria (no administrada).
Sí, FromStream() impide que la clase realice esta optimización. El costo es significativo, necesitará el doble de memoria cuando se cargue el mapa de bits. Esto será un problema cuando el mapa de bits es grande, está bordeando OOM cuando el programa ha estado funcionando por un tiempo (fragmentando el espacio de direcciones) y no se está ejecutando en un sistema operativo de 64 bits. Definitivamente evite hacer esto si el ancho de mapa x Altura x 4> = 45 MB, más o menos.
Parte del código, usted no tiene que pasar por el aro CopyStream:
public static Image LoadImageNoLock(string path) {
var ms = new MemoryStream(File.ReadAllBytes(path)); // Don't use using!!
return Image.FromStream(ms);
}
Tenga en cuenta que usted no desea deshacerse de la MemoryStream, podrás obtener una difícil de diagnosticar "error genérico" cuando el mapa de bits se usa si lo haces. Causado por la clase de imagen perezoso, leyendo la secuencia.
También necesita esto para obtener el mapa de bits. Bitmap bitmap = new Bitmap (LoadImageNoLock (ruta)); – Harris
MemoryStream es desechable, ¿quién se encargará de eliminarlo en esta solución? – kwesolowski