Condividi tramite


Procedura: dichiarare eventi personalizzati per evitare il blocco (Visual Basic)

In diverse circostanze è importante che un gestore eventi non blocchi i gestori eventi successivi. Gli eventi personalizzati consentono all'evento di chiamare i relativi gestori eventi in modo asincrono.

Per impostazione predefinita, il campo dell'archivio di backup per una dichiarazione di evento è un delegato multicast che combina in modo seriale tutti i gestori eventi. Questo significa che se un gestore richiede molto tempo per completare l'operazione, blocca gli altri gestori fino al termine di tale operazione. I gestori eventi ben strutturati non dovrebbero mai eseguire operazioni lunghe o che possono causare blocchi.

Invece di usare l'implementazione predefinita degli eventi forniti da Visual Basic, è possibile usare un evento personalizzato per eseguire i gestori eventi in modo asincrono.

Esempio

In questo esempio, la funzione di accesso AddHandler aggiunge il delegato per ogni gestore dell'evento Click a un oggetto ArrayList archiviato nel campo EventHandlerList.

Quando il codice genera l'evento Click, la funzione di accesso RaiseEvent richiama tutti i delegati del gestore eventi in modo asincrono usando il metodo BeginInvoke. Questo metodo richiama ogni gestore in un thread di lavoro e restituisce immediatamente il controllo, quindi i gestori non possono bloccarsi tra loro.

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

Vedi anche