ראינו בפעמים הקודמות כיצד ניתן להמנע מדליפות זכרון של הרשמות לEventים באמצעות מימוש של Weak Event.
אמרתי שעדיין יש בעיה – האובייקט שנרשם לאירוע אמנם כבר לא דולף, אבל הWeakEventHandlerים דולפים. הסיבה לכך היא שהEvent עדיין מחזיק Reference לWeakEventHandler ולכן הGarbage Collector לא אוסף אותו. (כמו בטיפ 201)
אז איך אפשר לפתור את הבעיה? פתרון אפשרי הוא להעביר לWeakEventHandler איזשהו Delegate שיבצע הסרת רישום מהEvent ברגע שהאובייקט מת:
source.EventRaised += new RuntimeWeakEventHandler<EventArgs>(OnEventRaised);
נכתוב ככה:
1
source.EventRaised += new RuntimeWeakEventHandler<EventArgs>(OnEventRaised, x => source.EventRaised -= x);
מה שבעצם קורה זה שברגע שהאובייקט שלנו מת, אנחנו יודעים לבטל את הרישום של הWeakEventHandler לEvent. אז מה שקורה זה שאין הצבעות לWeakEventHandler ולכן הGarbage Collector יכול לאסוף אותו.
מאחר והסינטקס לא כל כך להיט, אפשר ליצור Extension Method שיהפוך אותו לטיפה יותר יפה (ראו גם טיפים מספר 68-69):