Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Há várias circunstâncias em que é importante que um manipulador de eventos não bloqueie manipuladores de eventos subsequentes. Os eventos personalizados permitem que o evento chame seus manipuladores de eventos de forma assíncrona.
Por padrão, o campo backing-store para uma declaração de evento é um delegado multicast que combina em série todos os manipuladores de eventos. Isto significa que, se um manipulador demorar muito tempo a completar, bloqueará os outros manipuladores até que termine. (Manipuladores de eventos bem comportados nunca devem executar operações longas ou potencialmente bloqueadoras.)
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.
Exemplo
Neste exemplo, o acessador AddHandler adiciona o delegado a cada manipulador do evento Click a um ArrayList armazenado no campo EventHandlerList.
Quando o código gera o Click evento, o RaiseEvent acessador invoca todos os delegados do manipulador de eventos de forma assíncrona usando o BeginInvoke método. Esse método invoca cada manipulador em um thread de trabalho e retorna imediatamente, de modo que os manipuladores não podem bloquear uns aos outros.
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