Freigeben über


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

Wenn bestimmte Bedingungen vorliegen, darf ein Ereignishandler nachfolgende Ereignishandler nicht blockieren. Benutzerdefinierte Ereignisse ermöglichen den asynchronen Aufruf der Ereignishandler durch das betreffende Ereignis.

Standardmäßig ist das Feld des Sicherungsspeichers für eine Ereignisdeklaration ein Multicastdelegat, in dem alle Ereignishandler nacheinander zusammengefasst werden. Dies bedeutet, dass ein Handler, dessen Ausführung eine lange Zeitspanne erfordert, die anderen Handler blockiert, bis seine Ausführung beendet wurde. (Gut konzipierte Ereignishandler sollten niemals langwierige oder potenziell blockierende Operationen ausführen.)

Statt der von Visual Basic bereitgestellten Standardimplementierung von Ereignissen können Sie ein benutzerdefiniertes Ereignis verwenden, um die Ereignishandler asynchron auszuführen.

Beispiel

In diesem Beispiel fügt der AddHandler-Accessor einer im EventHandlerList-Feld gespeicherten ArrayList den Delegaten für jeden Handler des Click-Ereignisses zu.

Wenn Code das Click-Ereignis auslöst, ruft der RaiseEvent-Accessor mit der BeginInvoke-Methode alle Ereignishandlerdelegaten asynchron auf. Diese Methode ruft jeden Handler in einem Arbeitsthread auf und wird sofort beendet, 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

Aufgaben

Gewusst wie: Deklarieren von benutzerdefinierten Ereignissen, um Speicherplatz zu sparen (Visual Basic)

Referenz

ArrayList

BeginInvoke

Weitere Ressourcen

Ereignisse (Visual Basic)