我什么时候应该取消注册系统事件以防止内存泄漏?

时间:2011-09-03 08:24:03

标签: c# .net visual-studio-2010 memory-leaks systemevent

我正在使用像这样的系统:

            SystemEvents.SessionEnding += SystemEventsSessionEnding;

检测用户何时关闭或注销,但我已经读过我需要取消注册此事件以防止内存泄漏等。

我/何时应该这样做?

我已经看到我可以在SystemEvents.EventsThreadShutdown中执行此操作,此事件将在系统事件触发之前触发,如果这是真的,那么这应该是我应该取消注册我的系统事件的地方?

或者我应该在我的mainforms FormClosing事件中这样做? FormClosing事件是否会一直被触发?

谢谢!

2 个答案:

答案 0 :(得分:3)

您是否只在计划开始时订阅一次,并且只有在您的流程终止时才取消订阅?如果是这样,请不要打扰。

当你的进程终止时,如果有任何“系统级”挂钩,操作系统有责任为你清理这些 - 你不需要担心它。它不像操作系统会阻止你的对象被垃圾收集,尽管这个过程不再存在:)

答案 1 :(得分:1)

如果需要在应用程序实例的整个生命周期内触发该事件时收到警报,则不需要取消注册。如果您的对象超出了订阅该事件的范围,那么它们应该取消注册,因为事件对象包含对订阅者的引用,从而阻止它被GC。