Avatar billede davidfossil Nybegynder
09. marts 2007 - 12:48 Der er 6 kommentarer og
1 løsning

Image.Dispose rydder ikke ordenligt op?

Jeg har følgende metode som jeg forsøger at kalde ca. 50 gange i en løkke, for at skalere og komprimere nogle billeder i en mappe. Desværre når jeg kun til ca. nr. 40 før programmet smider en OutOfMemoryException efter mig.

Er der noget jeg gør galt, eller er der et memory leak i en af Image/Bitmap/Graphics klasserne?

static void CompressImage(string inputFile, string outputFile)
{
    using (Image original = Image.FromFile(inputFile))
    using (Bitmap scaled = new Bitmap(720, (int)(original.Height / (original.Width / (double)720))))
    using (Graphics gfx = Graphics.FromImage(scaled))
    {
        gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
        gfx.DrawImage(original, 0, 0, scaled.Width, scaled.Height);
        scaled.Save(outputFile, CODEC, PARAMS);
    }
}
Avatar billede jens_klinting Nybegynder
10. marts 2007 - 09:12 #1
Hej,
Lige et skud fra hoften. Har du prøvet at gennemtvinge et garbage collect i slutningen af metoden?
Dispose burde jo foretage oprydningen, men spørgsmålet er, om de objekter, Dispose kaldes på rent faktisk bliver garbage collectet eller blot markeres som værende klar til at blive collectet. 

System.GC.Collect() gennemtvinger et garbage collect af alle generationer af objekter. Der kan sendes en parameter med, som begrænser antallet af generationer, hvilket vel forbedrer eventuel performance lidt.

Prøv at indsætte System.GC.Collect(); i sidste linie i din metode, og se om det hjælper.

Mvh.
Jens
Avatar billede jens_klinting Nybegynder
10. marts 2007 - 09:39 #2
Hej igen,
Det var da vist noget værre sludder, jeg fik skrevet før. Dispose er til at frigive unmanaged resourcer. Garbage collection til oprydning af objekter, som man ikke længere har referencer til. Det er garbage collectionen, som skal give dig dine memory resourcer, så jeg tror stadig, at ovenstående løser problemet.

Mvh.
Jens
Avatar billede dr_chaos Nybegynder
10. marts 2007 - 21:19 #3
prøv at fjerne static.
Problemet er at du laver data behandling i static metode og det er nono.
Avatar billede tuxic Nybegynder
10. marts 2007 - 23:21 #4
Ah hva? Metoden berører jo udelukkende metodeparametre og ingen statiske variable.
Avatar billede arne_v Ekspert
12. marts 2007 - 01:16 #5
det lyder som en memory leak (forudsat at billed #40 ikke er større end de andre !)

der er ingen garanti for hvornår .NET vil kalde GC, men den vil kalde den inden
OutOfMemoryException !

og lokale variable bliver GC'et uanset om metoden er static eller ej
Avatar billede davidfossil Nybegynder
04. april 2007 - 11:54 #6
Beklager det sene svar - projektet røg lige på is, men nu har jeg så fået tid til at kigge på det igen. Jeg er helt enig med tuxic og arne_v i at GC burde rydde op i lokale variable i statiske såvel som ikke-statiske metoder, men desværre ser det ud til at dr_chaos har ret. Det hele spiller efter at jeg har samlet den problematiske kode i en klasse som jeg instansierer og kalder metoder på. Smid er svar, dr_chaos :)
Avatar billede dr_chaos Nybegynder
04. april 2007 - 18:32 #7
svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester