09. marts 2007 - 12:48Der 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); } }
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.
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.
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 :)
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.