我搜索了关键字使用的差异Handles http://msdn.microsoft.com/en-us/library/6k46st1y.aspx代替添加处理程序 http://msdn.microsoft.com/en-us/library/7taxzxka.aspx, in VB.NET http://en.wikipedia.org/wiki/Visual_Basic_.NET,但我无法解释为什么这段代码不起作用..
Imports System.Threading
Public Class MyClass_EventArgs
Inherits System.EventArgs
End Class
Public Class MyClass
Public Event MainThreadFinished(ByVal sender As Object, ByVal e As MyClass_EventArgs)
Private WithEvents MyEvents As MyClass
Private trd As Thread
Public Sub New()
'AddHandler MainThreadFinished, AddressOf Me.MyEvents_ThreadFinished
trd = New Thread(AddressOf mainThread)
trd.IsBackground = True
trd.Start()
RaiseEvent MainThreadFinished(Me, Nothing)
End Sub
Protected Overrides Sub Finalize()
trd.Abort()
End Sub
Protected Sub MyEvents_ThreadFinished(ByVal sender As Object, ByVal e As MyClass_EventArgs) _
Handles MyEvents.MainThreadFinished
MessageBox.Show("AAA")
End Sub
Private Sub mainThread()
RaiseEvent MainThreadFinished(Me, Nothing)
End Sub
End Class
好吧,这段代码永远不会响应事件,但是如果我取消注释以下行,代码就会工作并出现消息框......
'AddHandler MainThreadFinished, AddressOf Me.MyEvents_ThreadFinished
为什么会出现这种情况?
看起来你有了一个很好的发现!根据微软文档,RaiseEvent 语句 http://msdn.microsoft.com/en-us/library/fwd3bwed%28v=vs.100%29.aspx,
非共享事件不应在构造函数中引发
声明它们的类。虽然此类事件不会导致
运行时错误,它们可能无法被关联事件捕获
处理程序。使用Shared
如果需要,修饰符可创建共享事件
从构造函数引发事件。
换句话说,微软说你不应该做你正在做的事情——如果必须的话,不要使用共享事件。
在查看其他来源时,我会说之间的区别AddHandler
and Handles
是一个语法糖的问题。您可能想研究一下 C# 中的事件是如何完成的以获得更多见解(例如C# 事件 http://www.c-sharpcorner.com/uploadfile/dhananjaycoder/C-Sharp-events/). Handles
与一起使用WithEvents
作为类实例自动订阅事件的一种方式(否则显式完成+=
在 C# 中和AddHander
在 VB.NET 中)。
看来你的明确AddHandler
确保事件连接在事件发生之前就位RaiseEvent
,然后它就按照你想要的方式工作了。我只能猜测,如果没有这个,那些事件连接还没有完成 - 也就是说,它不起作用,因为编译器通过编译器编写者的任何设计模式在幕后插入执行相当于 AddHandler 的代码视为适当。考虑到对此的警告,设计者似乎很清楚这种可能的后果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)