我正在使用设备驱动程序,当系统进入睡眠状态时需要关闭它。我以为可以将SystemEvents.PowerModeChanged事件的处理程序添加到ApplicationEvents.vb中,如下所示:
Public Sub SystemEvents_PowerModeChanged(sender As Object, e As PowerModeChangedEventArgs) _
Handles SystemEvents.PowerModeChanged
If e.Mode = PowerModes.Suspend Then
logger.Trace("The computer is suspending. Closing device.")
'Close device
ElseIf e.Mode = PowerModes.Resume Then
logger.Trace("The computer is resuming operation from suspend mode. Opening device.")
' Open device
End If
End Sub
使用Handles
关键字处理事件。但是,Handles子句存在编译错误:
Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
WithEvents似乎总是为我在.NET中遇到的其他事件定义的,那么为什么这是不同的?我更喜欢使用Handles子句,因为这可以自动添加和删除处理程序。它还使功能保持独立,而不是在初始化程序,析构函数和函数本身之间进行扩展。是否可以在此事件上使用Handles声明?
此问题的线索是以下代码确实起作用:
AddHandler SystemEvents.PowerModeChanged, AddressOf SystemEvents_PowerModeChanged
SystemEvents类的事件与您习惯的事件不同,它们是静态事件。在vb.net中“共享”发言。您可以通过意识到只有一个“系统”来推断出这一点。因此,该活动只有一个来源。
这使得MSDN文章中有关WithEvents的文本与此相关:
您必须将WithEvents变量声明为对象变量,以便它们可以接受类实例。
您不能创建类型为SystemEvents的对象变量。因此,您不能使用WithEvents关键字。因此,您也不能使用Handles子句。退回AddHandler
是一个严格的要求。
而且,非常重要的是,RemoveHandler
当您不再对事件感兴趣时,必须显式使用。例如在Form的FormClosed事件处理程序中。必要的是,当UI不再存在时,SystemEvents停止触发事件处理程序。忘记这样做会导致内存泄漏(无法垃圾收集表单对象),如果幸运的话,会抛出ObjectDisposedException。如果关闭表单或窗口也终止了您的应用程序,则只能跳过此要求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句