如何:宣告自訂事件以避免封鎖 (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