Como declarar eventos personalizados para evitar bloqueio (Visual Basic)How to: Declare Custom Events To Avoid Blocking (Visual Basic)

Há várias circunstâncias em que é importante que um manipulador de eventos não bloqueie os manipuladores de eventos subsequentes.There are several circumstances when it is important that one event handler not block subsequent event handlers. Eventos personalizados permitem que o evento chame seus manipuladores de eventos de forma assíncrona.Custom events allow the event to call its event handlers asynchronously.

Por padrão, o campo de armazenamento de backup para uma declaração de evento é um delegado de multicast que combina em série todos os manipuladores de eventos.By default, the backing-store field for an event declaration is a multicast delegate that serially combines all the event handlers. Isso significa que, se um manipulador levar muito tempo para ser concluído, ele bloqueará os outros manipuladores até que seja concluído.This means that if one handler takes a long time to complete, it blocks the other handlers until it completes. (Manipuladores de eventos bem comparados nunca devem executar operações demoradas ou potencialmente bloqueadas.)(Well-behaved event handlers should never perform lengthy or potentially blocking operations.)

Em vez de usar a implementação padrão de eventos que Visual Basic fornece, você pode usar um evento personalizado para executar os manipuladores de eventos de forma assíncrona.Instead of using the default implementation of events that Visual Basic provides, you can use a custom event to execute the event handlers asynchronously.

ExemploExample

Neste exemplo, o acessador AddHandler adiciona o delegado para cada manipulador do evento Click a um ArrayList armazenado no campo EventHandlerList.In this example, the AddHandler accessor adds the delegate for each handler of the Click event to an ArrayList stored in the EventHandlerList field.

Quando o código gera o evento Click, o acessador RaiseEvent invoca todos os delegados do manipulador de eventos de forma assíncrona usando o método BeginInvoke.When code raises the Click event, the RaiseEvent accessor invokes all the event handler delegates asynchronously using the BeginInvoke method. Esse método invoca cada manipulador em um thread de trabalho e retorna imediatamente, portanto, os manipuladores não podem bloquear um ao outro.That method invokes each handler on a worker thread and returns immediately, so handlers cannot block one another.

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 tambémSee also