Compartir a través de


Cómo: Declarar eventos personalizados para evitar bloqueos (Visual Basic)

Hay varias circunstancias en las que resulta importante que un controlador de eventos no bloquee los controladores de eventos subsiguientes. Los eventos personalizados permiten al evento llamar de forma asincrónica a sus controladores de eventos.

De manera predeterminada, el campo de almacén de respaldo de una declaración de evento es un delegado multidifusión que combina de forma consecutiva todos los controladores de eventos. Esto significa que si un controlador tarda mucho tiempo en completarse, bloquea a los demás controladores hasta que finaliza. (Los controladores de eventos con buen comportamiento no deben realizar operaciones largas ni que puedan producir bloqueos.)

En lugar de utilizar la implementación predeterminada de eventos que proporciona Visual Basic, puede utilizar un evento personalizado para ejecutar los controladores de eventos de forma asincrónica.

Ejemplo

En este ejemplo, el descriptor de acceso AddHandler agrega el delegado para cada controlador del evento Click en un elemento ArrayList almacenado en el campo EventHandlerList.

Cuando el código provoca el evento Click, el descriptor de acceso RaiseEvent invoca a todos los delegados del controlador de eventos de forma asincrónica con el método BeginInvoke. Ese método invoca cada controlador en un subproceso de trabajo y vuelve inmediatamente, por lo que los controladores no se pueden bloquear entre si.

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

Vea también

Tareas

Cómo: Declarar eventos personalizados para conservar memoria (Visual Basic)

Referencia

ArrayList

BeginInvoke

Otros recursos

Eventos (Visual Basic)