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

Es gibt mehrere Umstände, in denen es wichtig ist, dass ein Ereignishandler nachfolgende Ereignishandler nicht blockiert. Benutzerdefinierte Ereignisse ermöglichen es dem Ereignis, seine Ereignishandler asynchron aufzurufen.

Standardmäßig ist das Backing-Store-Feld für eine Ereignisdeklaration ein Multicastdelegat, der alle Ereignishandler seriell kombiniert. Dies bedeutet, dass, wenn ein Handler lange dauert, bis er abgeschlossen ist, die anderen Handler blockiert werden, bis er abgeschlossen ist. (Gut verhaltende Ereignishandler sollten niemals langwierige 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 Delegaten für jeden Handler des Click Ereignisses zu einem ArrayList im EventHandlerList Feld gespeicherten hinzu.

Wenn der Code das Click Ereignis auslöst, ruft der RaiseEvent Accessor alle Ereignishandlerdelegate mithilfe der BeginInvoke -Methode asynchron auf. Diese Methode ruft jeden Handler für einen Workerthread auf und gibt sofort zurück, sodass Handler sich nicht gegenseitig blockieren können.

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