2011-09-03 45 views
1

我使用systemevents這樣的:什麼時候應該取消註冊系統事件以防止內存泄漏?

  SystemEvents.SessionEnding += SystemEventsSessionEnding; 

,以檢測當用戶shutsdown或註銷,但我已閱讀,我需要註銷此事件,以防止memoryleaks和這樣。

什麼時候該在哪裏做?

我已經看到我可以在SystemEvents.EventsThreadShutdown中做到這一點,這個事件將在系統事件觸發前觸發,如果這是真的,那麼這應該是我應該取消註冊我的系統事件的地方?

或者我應該這樣做我的mainforms FormClosing事件?在任何時候都會觸發FormClosing事件嗎?

謝謝!

回答

1

如果您需要在應用程序實例的整個生命週期中觸發該事件時收到警報,你不需要註銷它。如果你的對象超出了訂閱該事件的範圍,那麼它們應該取消註冊,因爲事件對象持有對訂閱者的引用,從而防止它被GC'd。

+0

S,我只需要在我的應用程序被濫用時提醒,這樣我就可以保存一些數據並取消註冊系統事件(我可能在閱讀2個答案後不需要)。 – syncis

3

在您的程序開始時,您是否只訂閱一次,並且只有在流程終止時纔會取消訂閱?如果是這樣,不要打擾。

當你的進程終止時,如果有任何「系統級」掛鉤,操作系統有責任爲你清理它 - 你不需要擔心。它不像操作系統將阻止你的對象被垃圾收集,儘管過程不存在更多:)

+0

...嗯,我通常避免在凌晨1點30分忍者忍受...我想這意味着我現在應該去睡覺了。 –

+0

@jon雙向飛碟,我只在節目開始時訂閱一次,是的,我認爲我需要在我的應用程序終止時取消訂閱。但也許我甚至不需要像你說的那樣?我正在保存一些數據,以便數據不會在系統化事件中丟失,但那就是全部。 – syncis

+0

@syncis:然後不,你不需要退訂。 –

相關問題