Exportar (0) Imprimir
Expandir Tudo
Este artigo foi traduzido por máquina. Coloque o ponteiro do mouse sobre as frases do artigo para ver o texto original. Mais informações.
Tradução
Original

Como: declarar eventos personalizados para evitar o bloqueio (Visual Basic)

Há várias circunstâncias quando é importante que um manipulador de eventos não bloqueie os manipuladores de eventos subsequentes. Eventos personalizados permitem que o evento chame seus manipuladores de eventos de forma assíncrona.

Por padrão, o campo de armazenamento reverso para uma declaração de evento é um representante de difusão seletiva que serialmente combina todos os manipuladores de eventos. Isso significa que se um manipulador levar um longo tempo para concluir, ele bloqueia os outros manipuladores até que ela seja concluída. (Os manipuladores de eventos bem comportados nunca devem executar operações longas ou possivelmente de bloqueio.)

Em vez de usar a implementação padrão de eventos que o Visual Basic fornece, você pode usar um evento personalizado para executar os manipuladores de eventos de forma assíncrona.

Nesse exemplo, o acessador AddHandler adiciona o representante para cada manipulador de evento Click para um ArrayList armazenado no campo EventHandlerList.

Quando o código dispara o evento Click, o acessador RaiseEvent chama todos os representantes de manipulador de eventos de forma assíncrona usando o método BeginInvoke. Esse método chama cada manipulador em um segmento de trabalho e retorna imediatamente, portanto, manipuladores não podem bloquear um ao outro.


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


Contribuições da comunidade

ADICIONAR
A Microsoft está realizando uma pesquisa online para saber sua opinião sobre o site do MSDN. Se você optar por participar, a pesquisa online lhe será apresentada quando você sair do site do MSDN.

Deseja participar?
Mostrar:
© 2015 Microsoft