Partager via


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

Il existe plusieurs cas où 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 façon asynchrone.

Par défaut, le champ du magasin de stockage pour une déclaration de l'événement est un délégué multicast qui associe en série tous les gestionnaires d'événements. Cela signifie que si un gestionnaire met un certain temps à s'exécuter, les autres gestionnaires sont bloqués tant qu'il n'a pas terminé. (Les gestionnaires d'événements valides ne doivent jamais exécuter des opérations longues ou susceptibles de créer un blocage).

Au lieu d'utiliser l'implémentation d'événements par défaut fournie 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 dans 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 de gestionnaire d'événements de façon asynchrone à l'aide de la méthode BeginInvoke. Étant donné que cette méthode appelle chaque gestionnaire sur un thread de travail et retourne immédiatement, les gestionnaires ne peuvent pas se bloquer mutuellement.

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

Tâches

Comment : déclarer des événements personnalisés pour économiser la mémoire (Visual Basic)

Référence

ArrayList

BeginInvoke

Autres ressources

Événements (Visual Basic)