C# program använter för mycket minne?!?

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Sep 2003

C# program använter för mycket minne?!?

Hej!

Har skrivit ett program som hanterar bilder, frameraten är någolunda hög så minnesanvändningen slår i taket, hur gör jag så c# avallokerar när jag vill?

private bool FastPerform(ref Bitmap target, ref Label label,...) { Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot); gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); ... }

Alltså, när funktionen är slut så verkar inte minnet avallokeras föränn programmet använder ca 1,5 gb ram, jag vill vara säker på att dessa är avallokerade när funktionen är slut. Kan man använda dispose? testade den på dex bmpScreenshot vilket resulterade i krash.

MVH
Dalton Sleeper

1: Intel i7-3930K | 32GB Corsair Dominator GT | Asus Rampage IV Extreme x79 | 2 x 1080 GameRock Premium 8GB | 2 x Samsung Pro 840 512GB | Corsair AX1200i | BenQ XL2411 24" / W1070 135" | Bose QC25 | Windows 10 Pro x64 | HTC Vive |
2: Intel Core i7-4700HQ | 32GB RAM | Intel HM87 Express | GTX 780M | 17" | Windows 10 x64 |

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Sep 2003

Dispose på bitmap i funktionen fungerade inge vidare, men utanför gick det av någon anledning. Dispose på graphics objektet är också med i funktionen. Gick från peak på 3 gb till 66mb!!

1: Intel i7-3930K | 32GB Corsair Dominator GT | Asus Rampage IV Extreme x79 | 2 x 1080 GameRock Premium 8GB | 2 x Samsung Pro 840 512GB | Corsair AX1200i | BenQ XL2411 24" / W1070 135" | Bose QC25 | Windows 10 Pro x64 | HTC Vive |
2: Intel Core i7-4700HQ | 32GB RAM | Intel HM87 Express | GTX 780M | 17" | Windows 10 x64 |

Trädvy Permalänk
Medlem
Plats
Laholm
Registrerad
Okt 2005

Haha lol, klart du måste kalla rätt funktioner för att slippa minnesluckor, det är knappast unikt för C#.

Vill du slippa tänka på att kalla Dispose() kan du göra såhär:

using(Graphics g = Graphics.FromImage(bmpScreenshot)) { // Nu kan du använda g hur mycket du vill. } // Här är g disposed och finns inte ens som variabel.

ASP.NET programmerare i C#
Twitter: http://www.twitter.com/hagbarddenstore

Trädvy Permalänk
Medlem
Registrerad
Jul 2001

using() är helt rätt - använder du det så stängs det automatiskt när det är klart och slipper många problem

Har varit på detta forum på tok för länge...

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Sep 2003

Okey, tackar för era svar, ett problem var att det krashade med dispose, men ska testa using iaf. Iaf var det inte bara graphics som läckte utan dispose, det var bitmapen också, den skall väll rensas upp med hjälp av garbage collector? Är ingen stjärna på C# och har nyligen börjat använda det.

1: Intel i7-3930K | 32GB Corsair Dominator GT | Asus Rampage IV Extreme x79 | 2 x 1080 GameRock Premium 8GB | 2 x Samsung Pro 840 512GB | Corsair AX1200i | BenQ XL2411 24" / W1070 135" | Bose QC25 | Windows 10 Pro x64 | HTC Vive |
2: Intel Core i7-4700HQ | 32GB RAM | Intel HM87 Express | GTX 780M | 17" | Windows 10 x64 |