如何:声明避免阻止的事件
更新:2007 年 11 月
在几种情况下,一个事件处理程序不阻止后续的事件处理程序很重要。自定义事件允许事件异步调用它的事件处理程序。
默认情况下,事件声明的后备存储字段是一个依次组合所有事件处理程序的多路广播委托。这意味着,如果一个处理程序的完成时间很长,它将阻止其他处理程序,直到它完成为止。(功能良好的事件处理程序应从不会执行冗长的或可能起阻止作用的操作。)
您可以不使用 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