Condividi tramite


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

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

Per impostazione predefinita il campo dell'archivio di backup di una dichiarazione di evento è un delegato multicast in cui tutti i gestori eventi vengono combinati in modo seriale. In altre parole se il completamento di un gestore richiede una notevole quantità di tempo, gli altri gestori verranno bloccati fino al termine del completamento. I gestori eventi ben progettati non dovrebbero mai eseguire operazioni lunghe o potenzialmente bloccanti.

Anziché utilizzare l'implementazione predefinita degli eventi forniti da Visual Basic, è possibile utilizzare un evento personalizzato per l'esecuzione asincrona dei gestori eventi.

Esempio

In questo esempio, la funzione di accesso AddHandler consente di aggiungere il delegato di ogni gestore dell'evento Click a un ArrayList memorizzato nel campo EventHandlerList.

Al momento della generazione dell'evento Click da parte del codice, alla funzione di accesso RaiseEvent è consentito richiamare tutti i delegati del gestore eventi in maniera asincrona tramite il metodo BeginInvoke. Con tale metodo è possibile richiamare ogni gestore su un thread di lavoro e di restituirlo immediatamente, in modo tale che i gestori non possano 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

Vedere anche

Attività

Procedura: dichiarare eventi personalizzati per proteggere la memoria (Visual Basic)

Riferimenti

ArrayList

BeginInvoke

Altre risorse

Eventi (Visual Basic)