Kat*_*tte 2 vb.net event-handling
我已经在VB.NET中搜索了使用关键字Handles而不是AddHandler的区别,但是我无法解释为什么此代码无法正常工作。
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
Run Code Online (Sandbox Code Playgroud)
好的,这段代码永远不会响应事件,但是如果我取消注释跟随行,代码就会起作用,并出现消息框...
'AddHandler MainThreadFinished, AddressOf Me.MyEvents_ThreadFinished
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
看来您已经找到了很好的发现!根据Microsoft文档RaiseEvent声明,
非共享事件不应在声明它们的类的构造函数中引发。尽管此类事件不会导致运行时错误,但它们可能无法被关联的事件处理程序捕获。
Shared如果需要从构造函数引发事件,请使用修饰符创建共享事件。
换句话说,微软表示您不应该做自己正在做的事情-如果必须的话,请使用共享事件。
在浏览其他资料时,我会说AddHandler和之间的差异Handles是语法糖的问题。您可能需要研究如何在C#中完成事件以获取更多信息(例如在C#Events中)。Handles用作WithEvents类的实例自动订阅事件的方式(否则,这+=在C#和AddHanderVB.NET中明确完成)。
似乎您的显式AddHandler确保了事件连接在之前就位RaiseEvent,因此它可以按您希望的那样工作。我只能猜测,没有这些事件,这些事件连接还没有完成-也就是说,它不起作用,因为无论如何,编译器都会通过编译器编写者采用的任何设计模式在后台插入执行与AddHandler等效的代码。被认为是适当的。考虑到他们对此的警告,设计师似乎已经充分意识到了这种可能的后果。
| 归档时间: |
|
| 查看次数: |
6862 次 |
| 最近记录: |