vb.net - 具有已处理属性的事件。这样保存吗?

时间:2009-11-05 13:30:30

标签: vb.net events

好的,我有一个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完成它的方法的方法?

2 个答案:

答案 0 :(得分:3)

引发事件与调用方法完全相同(具体来说,它调用MulticastDelegate,这是一个指向其他方法的指针列表,每个方法都将被执行);代码将在继续下一个语句之前处理所有事件处理程序。

答案 1 :(得分:1)

RaiseEvent等待每个事件完成(或至少必须),因为“正常”事件不是异步触发的。 RaiseEvent只是通过一个处理程序列表并调用每个。