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

另請參閱