Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Il existe plusieurs circonstances quand 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 stockage sous-jacent d’une déclaration d’événement est un délégué multidiffusion qui combine de manière séquentielle tous les gestionnaires d’événements. Cela signifie que si un gestionnaire met longtemps à s’exécuter, il bloque les autres gestionnaires jusqu’à ce qu’il termine. (Les gestionnaires d’événements bien comportés ne doivent jamais effectuer de longues opérations ou potentiellement bloquantes.)
Au lieu d’utiliser l’implémentation par défaut d’événements fourni par Visual Basic, vous pouvez utiliser un événement personnalisé pour exécuter les gestionnaires d’événements de manière asynchrone.
Exemple :
Dans cet exemple, l’accesseur AddHandler
ajoute le délégué de chaque gestionnaire de l’événement Click
à une ArrayList qui est stockée 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 manière asynchrone à l’aide de la BeginInvoke méthode. Cette méthode appelle chaque gestionnaire sur un thread de travail et retourne immédiatement, de sorte que les gestionnaires ne peuvent pas 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