好的,我有一个winforms应用程序,我的代码工作正常。 但我想知道我的代码是否是防弹的,或者它是否只能在没有负载的情况下运行。
让我解释一下:
我有一个窗体,我已经覆盖了OnKeyDown方法:
Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
dim args as new ActionEventArgs(ActionType.Bark)
RaiseEvent Action(me, args)
e.Handled = args.Handled
MyBase.OnKeyDown(e)
End Sub
正如您所看到的,我提出了一个自定义事件,然后查询它的Handled Variable。 我的Event / ActionEventArgs看起来像这样:
Public Event Action(sender as Object, e as ActionEventArgs)
Public Class ActionEventArgs
Inherits EventArgs
Public Handled as Boolean
Public Action as Action
Public Sub New(ByVal action as ActionType)
Me.Action = action
End Sub
End Class
其中ActionType是此枚举
Public Enum ActionType
Bark,
Jump,
FireNukeWithoutFurtherWarning
End Enum
现在我有一个注册到此事件的类,如果它知道如何处理ActionType,则将Handled设置为true。
Public Sub actionHandler(ByVal sender as Object, e as ActionEventArgs) Handles me.Action
If e.Handled then return
If e.Action = ActionType.Bark
Bark()
e.Handled = true
End If
End If
我在我的开发者机器上尝试了这个代码,它似乎有效。在OnKeyDown方法中,每次查询Handled变量时,我的actionHandler方法都会先运行 但我问我是否只是这种情况,因为我的开发人员机器处于空闲状态,事件队列处理得如此之快,或者我可以期待
RaiseEvent(...)
等待每个注册的EventHandler完成它的方法的方法?
答案 0 :(得分:3)
引发事件与调用方法完全相同(具体来说,它调用MulticastDelegate
,这是一个指向其他方法的指针列表,每个方法都将被执行);代码将在继续下一个语句之前处理所有事件处理程序。
答案 1 :(得分:1)
RaiseEvent等待每个事件完成(或至少必须),因为“正常”事件不是异步触发的。 RaiseEvent只是通过一个处理程序列表并调用每个。