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