在某些情況下,一個事件處理程式不封鎖後續事件處理程式很重要。 自定義事件可讓事件以異步方式呼叫其事件處理程式。
根據預設,事件宣告的支援存放區字段是多播委派,會串行化合併所有事件處理程式。 這表示,如果某個處理程式需要很長的時間才能完成,它會封鎖其他處理程式,直到完成為止。 (行為良好的事件處理程序絕對不應該執行冗長或潛在的封鎖作業。
您可以使用自定義事件,以異步方式執行事件處理程式,而不是使用Visual Basic提供的預設事件實作。
範例
在此範例中,存取子會將每個 AddHandler 事件處理程式的委派加入至儲存在 Click 欄位中的 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