2016-06-30 12 views
-3

Ich habe ein Gif-Bild in PictureBox in Windows Form verwendet. Wenn ich meine Anwendung ausführe, steigt die Speichernutzung durch die Anwendung weiter an.Gif Bild in Windows-Formular-Anwendung verursacht Speicherverlust

-Code ist:

pictureBox2.Image = Image.FromFile("image.gif"); 

Wie kann ich diese Situation loswerden? Danke!

+1

Setzen Sie mindestens den Stacktrace. – raven

+0

Wenn der Speicher voll ist, löscht GAC es. Ansonsten if (pictureBox2.Image! = Null) {pictureBox2.Image.Dispose()} –

+0

nicht genau, was die Mechanik von picturebox.image ist. aber es könnte nur sein, dass der Müllsammler denkt nicht, dass es notwendig ist, den Speicher noch zu befreien, so dass es weiter steigt – Neijwiert

Antwort

0

Wenn Sie sich die documentation of the image class ansehen, werden Sie sehen, dass die Klasse implementiert System.IDisposable.

Dies bedeutet, dass der Designer dieser Klasse Sie ermutigen möchte, aktiv dafür zu sorgen, dass Dispose() aufgerufen wird, wenn Sie das Bild nicht mehr benötigen. Der Grund dafür ist, dass der Designer der Klasse einige knappe Ressourcen verwendet, von denen es gut wäre, wenn sie freigegeben würden, sobald das Objekt nicht mehr benötigt würde.

In Ihrem Fall ist die seltene Quelle (unter anderem) Speicher.

Natürlich wird der Garbage Collector sicherstellen, dass das Objekt entsorgt wird, aber wenn Sie es dem Garbage Collector überlassen, wird dies nicht so schnell wie möglich sein. Normalerweise sind Sie nicht sicher, wann der Garbage Collector den Speicher aufräumt.

Wenn Sie also Bilder in einem hohen Tempo laden, ist die Wahrscheinlichkeit hoch, dass Ihre alten Bilder nicht vor dem Laden des nächsten Bildes in den Müll geworfen werden.

Um das Objekt stellen Sie sicher, so schnell wie möglich angeordnet ist, Sie so etwas wie verwenden:

Image myImage = ... 
DoSomeImageHandling (myImage) 
// myImage not needed anymore: 
myImage.Dispose(); 
// load a new myImage: 
myImage = ... // or: myImage = null; 

Das Problem dabei ist, dass, wenn DoSomeImageHandling eine Ausnahme Dispose nicht aufgerufen wirft. die using-Anweisung wird darum kümmern:

using (Image myImage = ...) 
{ 
    DoSomeImageHandling (myImage); 
} 

Wenn nun die Verwendung von Block verlassen wird, aus welchem ​​Grunde, ob sie in der Regel nach links oder nach dem Ausnahmeprinzip oder nach einer Rückkehr oder was auch immer, myImage.Dispose() ist namens.

By the way, ist die knappe Quelle in Ihrem Fall nicht nur Speicher, wird die Datei auch, solange Sie das Bild verfügen nicht gesperrt, wie die folgenden Code

string fileName = ... 
Image myImage = new Image(fileName); 
DoSomething(myImage); 
// my image and the file not needed anymore: delete the file: 

myImage = null; // forgot to call Dispose() 
File.Delete(fileName); 
// quite often IOException, because the file is still in use 

Der richtige Code zeigt, würde be:

string fileName = ... 
using (Image myImage = new Image(fileName)) 
{ 
    DoSomething(myImage); 
} 
// Dispose has been called automatically, the file can be deleted 
File.Delete(fileName); 
Verwandte Themen