Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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