Autor |
Beitrag |
Christoph1972
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Sa 10.04.10 14:13
Hallo!
Asche über mein Haupt.
Ich habe eine Funktion mit der ich Images via FileStream „sicher“ lade, damit die Images nicht auf dem Laufwerk blockiert werden. Das habe ich wir folgt gelöst:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private Image LoadImageSave(string file) { if (!File.Exists(file)) return null;
Bitmap saveBitmap = null; using (FileStream fs = new FileStream(file, FileMode.Open)) { saveBitmap = new Bitmap(fs); } return (Image)saveBitmap; } |
Nun ist es aber so, das mit jedem Aufruf der Arbeitsspeicher voller wird, bis es zum Überlauf kommt.
Könnte mir mal jemand meinen Gedankenfehler aufzeigen? Ich komme einfach nicht drauf, was ich hier falsch mache.
Ach ja, der Funktionsaufruf sieht lediglich so aus:
picturBox.Image = LoadImageSave(Bild);
_________________ Gruß
Christoph
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Sa 10.04.10 15:16
Das alte Image solltest du vor der Zuweisung lieber disposen  .
_________________ >λ=
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Sa 10.04.10 16:24
Hi,
das habe ich natürlich versucht, hat aber leider keine Auswirkung. Oder kann es sein, das es zulange dauert, bis der GC das Object tatsächlich freigibt?
_________________ Gruß
Christoph
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Sa 10.04.10 16:57
Ich habe es unteranderem so versucht:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| if (image != null) image.Dispose();
image = new Bitmap (LoadImageSave(file)); PicBox.Image = image; |
Ich verstehe das nicht......
An meiner Methode liegt es übrigens nicht. Das Problem besteht auch bei: BitMap test = new BitMap(file)
_________________ Gruß
Christoph
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 10.04.10 17:04
Das new Bitmap (LoadImageSave(file)) erzeugt doch noch ein Image zusätzlich zu dem, welches die Methode zurückgibt. Und letzteres wird nicht freigegeben.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Sa 10.04.10 17:14
Aber das letztere darf ja auch nicht freigegeben werden, da dieses ja verwendet wird.
[EDIT] auch ohne new besteht das Problem weiter. Also image = LoadImageSave(file).
_________________ Gruß
Christoph
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Sa 10.04.10 17:58
C#-Quelltext 1: 2: 3: 4: 5: 6:
| while (true) { if (pictureBox1.Image != null) pictureBox1.Image.Dispose(); pictureBox1.Image = new Bitmap(@"C:\Users\Kha\Pictures\Wallpapers\28-01-2009.jpg"); } | ...und nichts passiert  . Ohne Dispose bin ich schnell bei 1GB.
Christoph1972 hat folgendes geschrieben : | Oder kann es sein, das es zulange dauert, bis der GC das Object tatsächlich freigibt? |
IDisposable und GC haben nichts miteinander zu tun... als Notfallleine ruft der Finalizer aber dann doch lieber noch Dispose auf, sollte es der Programmierer vergessen haben  .
_________________ >λ=
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Sa 10.04.10 18:25
Also, ich bin auch mit Dispose schnell bei 1GB. Ich verstehe das nicht, mein Code ist jetzt identisch mit deinem, nur das ich das Image aus meiner Funktion lade.
_________________ Gruß
Christoph
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Sa 10.04.10 18:28
Prima, ich habe herausgefunden, das es mit dem Format des Bilses zu tun hat. Wenn ich ein gif lade ist alles Ok, aber bei einer Verktorgrafik vom Typ emf läuft der Speicher voll......
_________________ Gruß
Christoph
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Sa 10.04.10 20:06
So, alles OK. Ich hatte garnicht mehr geschaut ob es tatsächlich einen Überlauf gibt, ich hatte immer nur den Ram-Chart im Auge. Durch die großen EMF-Files ist der Verbrauch an Arbeitsspeicher groß, aber spätesten kurz vor knapp wird aufgeräumt. Ich hätte nicht gedacht, das es nötig ist das zugewiesene Image einer PictureBox zu disposen, da ich davon ausgegangen bin, das es überschrieben wird. Ich sollte älte Projekte noch mal durchsehen........
Vielen Dank euch!
_________________ Gruß
Christoph
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: So 11.04.10 11:25
Sorry, ich muss das leider zurücknehmen. Hin und wieder kommt es zu einem Überlauf. Das darf doch nicht sein, oder? Ich finde es auch seltsam, das der User das aktuelle Image disposen "soll", in der Dokumentation wird das nicht erwähnt. In meinen Augen wäre das schlecht programmiert. Wenn ich dem User ein Property zur verfügung stelle, das ein Überlauf verurschachen kann, dann würde ich das als Entwickler im Setter abfangen. Zudem macht es keinen sinn, das alte Image Objekt zu erhalten, oder?
Und weiter versuchen...........
_________________ Gruß
Christoph
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 11.04.10 12:40
|
|
Christoph1972 
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: So 11.04.10 20:46
Hi, der Überlauf ist nicht reproduzierbar. Na ja, ich hoffe das es eine unglücklich Verkettung von Ereignissen war und das Problem nicht wieder auftritt. Bisher bin ich immer achtlos mit Image Objekten umgegangen, das wird seit diesem Thread anders sein. Immer schön disposen
Also, vielen Dank für die hilfreiche Unterstützung!
Ach ja, eigentlich gehört das nach Grafik/Multimedia verschoben, hatte ja nichts mit meinem Stream zu tun.
_________________ Gruß
Christoph
|
|