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