Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det finns flera omständigheter när det är viktigt att en händelsehanterare inte blockerar efterföljande händelsehanterare. Med anpassade händelser kan händelsen anropa dess händelsehanterare asynkront.
Som standard är lagringsfältet för en händelsedeklaration en multicastdelegering som kombinerar serielt alla händelsehanterare. Det innebär att om en hanterare tar lång tid att slutföra, blockerar den de andra hanterarna tills den har slutförts. (Väluppfostrade händelsehanterare bör aldrig utföra långa eller potentiellt blockerande åtgärder.)
I stället för att använda standardimplementeringen av händelser som Visual Basic tillhandahåller kan du använda en anpassad händelse för att köra händelsehanterarna asynkront.
Exempel
I det här exemplet lägger till accessorn delegering till var och en av hanterarna av eventet AddHandler till en Click lagrad i ArrayList fältet.
När koden genererar Click händelsen anropar RaiseEvent-accessorn alla händelsehanterardelegater asynkront med hjälp av BeginInvoke-metoden. Den metoden anropar varje hanterare i en arbetstråd och returnerar omedelbart, så hanterare kan inte blockera varandra.
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