Gör så här: Deklarera anpassade händelser för att undvika blockering (Visual Basic)
Det finns flera omständigheter när det är viktigt att en händelsehanterare inte blockerar efterföljande händelsehanterare. Med anpassade händelser kan händelsen anropa dess händelsehanterare asynkront.
Som standard är fältet backing-store för en händelsedeklaration ett multicast-ombud som seriellt kombinerar alla händelsehanterare. Det innebär att om en hanterare tar lång tid att slutföra blockerar den de andra hanterare tills den har slutförts. (Väluppfostrade händelsehanterare bör aldrig utföra långa eller potentiellt blockerande åtgärder.)
I stället för att använda standardimplementeringen av händelser som Visual Basic tillhandahåller kan du använda en anpassad händelse för att köra händelsehanterarna asynkront.
Exempel
I det här exemplet AddHandler
lägger accessorn till ombudet för varje hanterare av Click
händelsen till en ArrayList lagrad i EventHandlerList
fältet.
När koden genererar Click
händelsen RaiseEvent
anropar accessorn alla händelsehanterare asynkront delegerar med hjälp av BeginInvoke metoden. Den metoden anropar varje hanterare i en arbetstråd och returnerar omedelbart, så hanterare kan inte blockera varandra.
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