共用方式為


如何:宣告自定義事件以避免封鎖 (Visual Basic)

在某些情況下,一個事件處理程式不封鎖後續事件處理程式很重要。 自定義事件可讓事件以異步方式呼叫其事件處理程式。

根據預設,事件宣告的支援存放區字段是多播委派,會串行化合併所有事件處理程式。 這表示,如果某個處理程式需要很長的時間才能完成,它會封鎖其他處理程式,直到完成為止。 (行為良好的事件處理程序絕對不應該執行冗長或潛在的封鎖作業。

您可以使用自定義事件,以異步方式執行事件處理程式,而不是使用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

另請參閱