קוד C# שתופח במנהל המשימות
-
יש לי את הקוד הבא, ומשום מה הזכרון לא מתנקה בסוף כל מעבר על הלולאה, את זה אני רואה ממנהל המשימות שזה מתחיל מבייטים בודדים ותופח לכמה מגה. מה יכולה להיות הבעיה שהאובקטים לא מתנקים?
for (;;) { try { Thread.Sleep(45000); Bitmap b = new Bitmap(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height); Graphics g = Graphics.FromImage(b); g.CopyFromScreen(Point.Empty, Point.Empty, Screen.PrimaryScreen.WorkingArea.Size); var d = DateTime.Now.Ticks.ToString(); b.Save(y + "\\" + d + ".jpg", ImageFormat.Jpeg); b.Dispose(); g.Dispose(); d = null; b.Dispose(); } פורסם במקור בפורום CODE613 ב04/06/2017 14:13 (+03:00)
-
GC לא מנקה מייד שאתה משחרר, הוא מנקה כשצריך
פורסם במקור בפורום CODE613 ב04/06/2017 15:59 (+03:00)
-
לצורך הפעולה שנראה שאתה עושה יש ספריות ועדיף שתשתמש איתם.
(אגב, הGDI שזה ספריית הגרפיקה הותיקה של דוטנט מאוד מועדת לבאגים).
C# זה שפה עילית בה יש למתכנת את החופש מלחשוב מה קורה עם הזיכרון כאשר אופי הקוד שלו הוא עם "צוארון לבן" ולא מתעסק עם עניינים שמחייבים התייחסות לחומרה. אם הוא כן מתעסק בזה, החופש נגמר וצריך לעבוד עם הזיכרון ע"י מצביעים.
אפשר להכריח את הזיכרון להתנקות אבל זה עלות ביצועים גבוהה.פורסם במקור בפורום CODE613 ב04/06/2017 18:54 (+03:00)
-
אכן כן. אבל האם הכוונה היא שאם זה יתפח למימדים מדאיגים פתאום יופיע הGC ויציל את המצב, ומיילא אין לי מה לדאוג או שיש משהו שאפשר לעשות בקוד שיהיה יותר יעיל ופחות בעיתי מבחינה זו?
פורסם במקור בפורום CODE613 ב05/06/2017 09:21 (+03:00)
-
אין לך מה לדאוג....
תן לCG לנהל אותו.
זה בדיוק התפקיד שלו.פורסם במקור בפורום CODE613 ב05/06/2017 11:39 (+03:00)
2/6