Gewusst wie: Deklarieren von benutzerdefinierten Ereignissen, um eine Blockierung zu vermeiden (Visual Basic)

Es gibt mehrere Umstände, wenn es wichtig ist, dass ein Ereignishandler keine nachfolgenden Ereignishandler blockiert. Benutzerdefinierte Ereignisse ermöglichen es dem Ereignis, seine Ereignishandler asynchron aufzurufen.

Standardmäßig ist das Backing-Store-Feld für eine Ereignisdeklaration ein Multicast-Stellvertretung, der alle Ereignishandler serielle kombiniert. Dies bedeutet, dass ein Handler, wenn ein Handler eine lange Zeit dauert, bis er abgeschlossen ist, die anderen Handler blockiert. (Gut verhaltene Ereignishandler sollten nie lange oder potenziell blockierende Vorgänge ausführen.)

Anstatt die Standardimplementierung von Ereignissen zu verwenden, die Visual Basic bereitstellt, können Sie ein benutzerdefiniertes Ereignis verwenden, um die Ereignishandler asynchron auszuführen.

Beispiel

In diesem Beispiel fügt der AddHandler Accessor den Stellvertretung für jeden Handler des Click Ereignisses zu einem ArrayList gespeicherten EventHandlerList Feld hinzu.

Beim Auslösen des Click Ereignisses ruft der RaiseEvent Accessor alle Ereignishandlerstellvertretungen asynchron mithilfe der BeginInvoke Methode auf. Diese Methode ruft jeden Handler auf einem Arbeitsthread auf und gibt sofort zurück, Handler können also keine andere blockieren.

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

Siehe auch