Condividi tramite


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

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

Per impostazione predefinita, il campo di archiviazione per una dichiarazione di evento è un delegato multicast che combina serialmente tutti i gestori degli eventi. Ciò significa che se un gestore impiega molto tempo per completare, blocca gli altri gestori finché non ha terminato. I gestori eventi ben comportati non devono mai eseguire operazioni lunghe o potenzialmente bloccanti.

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

Esempio

In questo esempio, l'accessor aggiunge il delegato per ogni gestore dell'evento AddHandler a un Click memorizzato nel campo ArrayList.

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

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

Vedere anche