Когда я должен отменить регистрацию системных событий, чтобы предотвратить утечки памяти? - PullRequest
1 голос
/ 03 сентября 2011

Я использую системы, как это:

            SystemEvents.SessionEnding += SystemEventsSessionEnding;

чтобы определить, когда пользователь выключается или выходит из системы, но я прочитал, что мне нужно отменить регистрацию этого события, чтобы предотвратить утечки памяти и тому подобное.

Когда / Где я должен это сделать?

Я видел, что я могу сделать это в SystemEvents.EventsThreadShutdown, это событие сработает ДО запуска системных событий, и если это правда, то это должно быть место, где я должен отменить регистрацию моих системных событий?

Или я должен сделать это в моем событии FormClosing mainforms? Будет ли событие FormClosing запускаться постоянно?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 03 сентября 2011

Вы подписываетесь только один раз, в начале своей программы, и вы отмените подписку, только когда ваш процесс заканчивается? Если это так, не беспокойтесь.

Когда ваш процесс завершается, и если есть какие-то зацепки «системного уровня», то операционная система должна очистить их для вас - вам не нужно об этом беспокоиться. Не похоже, что операционная система будет препятствовать сборке мусора для ваших объектов, несмотря на то, что процесс больше не существует:)

1 голос
/ 03 сентября 2011

Если вам нужно получать оповещение о том, что это событие происходит в течение всего жизненного цикла экземпляра приложения, то нет, вам не нужно его отменять. Если у вас есть объекты, выходящие за пределы области действия, которые подписываются на это событие, то они должны быть отменены, поскольку объект события содержит ссылку на подписчика, предотвращая его GC'd.

...