Condividi tramite


Procedura: dichiarare gli eventi per evitare il blocco

Aggiornamento: novembre 2007

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 gli eventi per preservare l'utilizzo della memoria

Riferimenti

Istruzione Event

ArrayList

BeginInvoke