Compartir a través de


Procedimiento para declarar eventos personalizados para evitar el bloqueo (Visual Basic)

Hay varias circunstancias cuando es importante que un controlador de eventos no bloquee los controladores de eventos posteriores. Los eventos personalizados permiten que el evento llame a sus controladores de eventos de forma asincrónica.

De forma predeterminada, el campo de memoria auxiliar de una declaración de eventos es un delegado de multidifusión que combina en serie todos los controladores de eventos. Esto significa que si un controlador tarda mucho tiempo en completarse, bloquea a los otros controladores hasta que se haya completado. (Los controladores de eventos bien comportados nunca deben realizar operaciones largas o potencialmente de bloqueo.)

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

Ejemplo

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

Cuando el código genera el evento Click, el accesor RaiseEvent invoca asincrónicamente a todos los delegados del controlador de eventos mediante el método BeginInvoke. Ese método invoca cada controlador en un subproceso de trabajo y devuelve inmediatamente, por lo que los controladores no pueden bloquearse entre sí.

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

Consulte también