¿Es posible utilizar el método FromStream de System.Drawing.Image sin tener que mantener la secuencia abierta durante el tiempo de vida de la imagen?Cargando una imagen de una secuencia sin mantener la secuencia abierta
Tengo una aplicación que carga un montón de gráficos de la barra de herramientas de los archivos de recursos, usando una combinación de Image.FromStream
y Assembly.GetManifestResourceStream
.
El problema que tengo es que, aunque funciona bien en Windows 7, en Windows XP, la aplicación se bloquea si un elemento de la interfaz de usuario vinculado a una de estas imágenes está deshabilitado. En Windows 7, la imagen se muestra en escala de grises. En XP, se bloquea con una excepción de falta de memoria.
Después de un montón de capullo de cabello, finalmente lo he rastreado hasta la carga inicial de la imagen. Como una cuestión de rutina, si puedo crear cualquier objeto que implementa IDisposable
que también se destruye en el mismo método, me envuelvo en una instrucción using, por ejemplo
using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName))
{
image = Image.FromStream(resourceStream);
}
Si quito la instrucción using para que el ISN corriente no dispuesto, entonces la aplicación ya no se bloquea en XP. Pero ahora tengo un montón de secuencias "huérfanas" que cuelgan: las imágenes se almacenan en clases de comando y estas eliminan correctamente las imágenes cuando se eliminan, pero la transmisión original no está dispuesta.
Revisé la documentación para FromStream
y confirma que la transmisión debe permanecer abierta. ¡Por qué esto no se ha estropeado y no se ha quemado en el sistema de desarrollo de Windows 7 es un misterio, sin embargo!
Realmente no quiero esta secuencia dando vueltas, y ciertamente no quiero tener que almacenar una referencia a esta secuencia así como a la imagen para poder deshacerme de ella más tarde. Solo necesito esa secuencia una vez, así que quiero deshacerme de ella :)
¿Es posible crear la imagen y luego matar la secuencia de vez en cuando?
Por el manera, una 'OutOfMemoryException' en' System.Drawing' usualmente significa * error genérico * en GDI +. El motivo es [histórico] (http://stackoverflow.com/questions/2610416/is-there-a-reason-image-fromfile-throws-an-outofmemoryexception-for-an-invalid-im) y se debe al mapeo de códigos de error no gestionados. –
Si la transmisión que pasa a Image.FromStream no se puede buscar, puede cerrar la secuencia de forma segura. Pero este es un comportamiento no documentado, así que utilícelo bajo su propio riesgo. – user2452157