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