我正在使用像这样的系统:
SystemEvents.SessionEnding += SystemEventsSessionEnding;
检测用户何时关闭或注销,但我已经读过我需要取消注册此事件以防止内存泄漏等。
我/何时应该这样做?
我已经看到我可以在SystemEvents.EventsThreadShutdown中执行此操作,此事件将在系统事件触发之前触发,如果这是真的,那么这应该是我应该取消注册我的系统事件的地方?
或者我应该在我的mainforms FormClosing事件中这样做? FormClosing事件是否会一直被触发?
谢谢!
答案 0 :(得分:3)
您是否只在计划开始时订阅一次,并且只有在您的流程终止时才取消订阅?如果是这样,请不要打扰。
当你的进程终止时,如果有任何“系统级”挂钩,操作系统有责任为你清理这些 - 你不需要担心它。它不像操作系统会阻止你的对象被垃圾收集,尽管这个过程不再存在:)
答案 1 :(得分:1)
如果需要在应用程序实例的整个生命周期内触发该事件时收到警报,则不需要取消注册。如果您的对象超出了订阅该事件的范围,那么它们应该取消注册,因为事件对象包含对订阅者的引用,从而阻止它被GC。