La creazione di un oggetto di tipo Image da un file
nasconde una piccola insidia. Consideriamo il seguente snippet di codice:
Image myImage = Image.FromFile("filename.jpg")
Ciò che accade dietro le quinte è che nel field
internal IntPtr nativeImage
viene memorizzato un handler al file filename.jpg, che rimane aperto
finché non si richiama il metodo Dispose() di myImage. Il problema è che,
ovviamente, il file risulta bloccato e il sistema ha una risorsa impegnata;
inoltre, se dimentichiamo di effettuare la Dispose, questa situazione perdura
fino a che non viene effettuato un GarbageCollecting o, al peggio, fino alla
chiusura dell'applicazione.
Come ovviare? Personalmente, quando devo caricare un'immagine da file, faccio
così:
Image myImage;
using (Image img = Image.FromFile("filename.jpg")
{
myImage = new Bitmap(img);
}
Il costruttore dell'oggetto Bitmap, infatti, carica l'immagine e la salva
sull'oggetto stesso utilizzando GDI+; da Reflector:
public Bitmap(Image original, int width, int height) : this(width, height)
{
using (Graphics graphics1 = null)
{
graphics1 = Graphics.FromImage(this);
graphics1.Clear(Color.Transparent);
graphics1.DrawImage(original, 0, 0, width, height);
}
}
In questo modo non facciamo altro che applicare la best practice che
consiglia di tenere impiegata una risorsa esterna per il minor tempo
possibile.
Ciao
powered by IMHO 1.3