如何:声明自定义事件以避免阻止 (Visual Basic)

在几种情况下,一个事件处理程序不阻止后续的事件处理程序很重要。 自定义事件允许事件异步调用它的事件处理程序。

默认情况下,事件声明的后备存储字段是一个依次组合所有事件处理程序的多路广播委托。 这意味着,如果一个处理程序的完成时间很长,它将阻止其他处理程序,直到它完成为止。 (功能良好的事件处理程序应从不会执行冗长的或可能起阻止作用的操作。)

您可以不使用 Visual Basic 提供的默认事件实现功能,而是使用自定义事件异步执行事件处理程序。

示例

在本示例中,AddHandler 访问器将 Click 事件的每个处理程序的委托添加到存储在 EventHandlerList 字段中的 ArrayList

在代码引发 Click 事件时,RaiseEvent 访问器将使用 BeginInvoke 方法异步调用所有事件处理程序的委托。 该方法在辅助线程上调用每个处理程序并立即返回,这样处理程序便无法互相阻止。

Public NotInheritable Class ReliabilityOptimizedControl
    'Defines a list for storing the delegates
    Private EventHandlerList As New ArrayList

    'Defines the Click event using the custom event syntax.
    'The RaiseEvent always invokes the delegates asynchronously
    Public Custom Event Click As EventHandler
        AddHandler(ByVal value As EventHandler)
            EventHandlerList.Add(value)
        End AddHandler
        RemoveHandler(ByVal value As EventHandler)
            EventHandlerList.Remove(value)
        End RemoveHandler
        RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
            For Each handler As EventHandler In EventHandlerList
                If handler IsNot Nothing Then
                    handler.BeginInvoke(sender, e, Nothing, Nothing)
                End If
            Next
        End RaiseEvent
    End Event
End Class

请参见

任务

如何:声明自定义事件以节省内存 (Visual Basic)

参考

ArrayList

BeginInvoke

其他资源

事件 (Visual Basic)