Laden...

GDI Fehler, Prozess wird bereits verwendet; Wie ressource wieder freigeben?

Erstellt von Duesmannr vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.571 Views
D
Duesmannr Themenstarter:in
161 Beiträge seit 2017
vor 6 Jahren
GDI Fehler, Prozess wird bereits verwendet; Wie ressource wieder freigeben?

Habe bereits gegooglet und die Suchfunktion benutzt, aber keine Lösung gefunden.

Habe ein Panel wo ich ein Bild anzeige. Bloß egal wie, ich bekomme die Ressource nicht mehr frei.

"this.BackgroundImage" => Image Variable


            using (Bitmap bmp = new Bitmap(this.lstPfadeFotos[this.CurrentPicture - 1]).Zoom(this.panPicture.Size))
                this.BackgroundImage = new Bitmap(bmp);
            this.panPicture.BackgroundImage = this.BackgroundImage;
            this.BackgroundImage.Dispose();
            this.BackgroundImage = null;
            this.panPicture.BackgroundImage.Dispose();
            this.panPicture.BackgroundImage = null;
            bool t = this.CanOpenFile(this.lstPfadeFotos[this.CurrentPicture - 1]);

(this.lstPfadeFotos[this.CurrentPicture - 1]) = Pfad zur Datei.
Bei " this.CanOpenFile" kommt immer False raus, Methode versucht einfach die Datei zu öffnen.

Zoom Erweiterungsfunktion:


        public static Bitmap Zoom(this Image img, Size max)
        {
            double factorHo = (double)max.Width / (double)img.Width;
            double factorVe = (double)max.Height / (double)img.Height;
            double factor = GetSmaller(factorHo, factorVe);
            return new Bitmap(img, new Size((int)(img.Width * factor), (int)(img.Height * factor)));
        }

        private static double GetSmaller(double n1, double n2)
        {
            if (n1 < n2)
                return n1;
            else
                return n2;
        }

Aber wo blockiert das Programm die Ressource?

709 Beiträge seit 2008
vor 6 Jahren

Hi,
wenn ich das auf die Schnelle richtig sehe, dann wird von dem Bitmap, das an die Zoom-Erweiterungsmethode übergeben wird, kein Dispose aufgerufen.

D
Duesmannr Themenstarter:in
161 Beiträge seit 2017
vor 6 Jahren

Hab die als Erweiterungsmethode entfernt und nur als statische Methode dar gelassen.
Innerhalb einer using Methode aufgerufen und es funktioniert, danke !

78 Beiträge seit 2016
vor 6 Jahren

Nur mal gerade auf die schnelle drauf geguckt... werd sicherlich gleich korrigiert wenn's nicht stimt 😉

Ich glaube du rufst das Dispose nicht auf dem richtigen Bitmap.


   using (Bitmap bmp = new Bitmap(this.lstPfadeFotos[this.CurrentPicture - 1]).Zoom(this.panPicture.Size))
                this.BackgroundImage = new Bitmap(bmp);

Das Dispose nach dem Using wird auf dem Bitmap angewendet, dass aus der Zoom-Funktion zurückgegeben wird.

Nicht auf dem Bitmap das mit ...


new Bitmap(this.lstPfadeFotos[this.CurrentPicture - 1])

... erzeugt wird.

Daher bleibt der Handle bestehen.

Nachtrag:
Ich sollte mal den Thread ganz lesen. Wurde ja schon beantwortet. Sorry 😉

http://dotnet-paderborn.azurewebsites.net/

709 Beiträge seit 2008
vor 6 Jahren

Deine Erklärung liefert auf jeden Fall detailliertere Infos für die Nachwelt als mein kurzer Satz. =)