Partager via


Comment : déclarer des événements personnalisés pour éviter les blocages (Visual Basic)

Il existe plusieurs circonstances dans lesquelles il est important qu’un gestionnaire d’événements ne bloque pas les gestionnaires d’événements suivants. Les événements personnalisés permettent à l’événement d’appeler ses gestionnaires d’événements de manière asynchrone.

Par défaut, le champ de magasin de stockage pour une déclaration d’événement est un délégué de multidiffusion qui combine en série tous les gestionnaires d’événements. Cela signifie que si un gestionnaire prend beaucoup de temps, il bloque les autres gestionnaires jusqu’à ce qu’il se termine. (Les gestionnaires d'événements bien élevés ne doivent jamais effectuer d'opérations longues ou potentiellement bloquantes)

Au lieu d’utiliser l’implémentation par défaut des événements fourni par Visual Basic, vous pouvez utiliser un événement personnalisé pour exécuter les gestionnaires d’événements de façon asynchrone.

Exemple

Dans cet exemple, l’accesseur AddHandler ajoute le délégué pour chaque gestionnaire de l’événement Click à un ArrayList stocké dans le champ EventHandlerList.

Lorsque le code déclenche l’événement Click , l’accesseur RaiseEvent appelle tous les délégués du gestionnaire d’événements de manière asynchrone à l’aide de la méthode BeginInvoke. Cette méthode appelle chaque gestionnaire sur un thread de travail et retourne immédiatement, de sorte que les gestionnaires ne peuvent pas se bloquer les uns les autres.

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

Voir aussi