Postupy: Deklarování vlastních událostí k zabránění blokování (Visual Basic)
Existuje několik okolností, kdy je důležité, aby jedna obslužná rutina události neblokovala následné obslužné rutiny událostí. Vlastní události umožňují události volat obslužné rutiny událostí asynchronně.
Ve výchozím nastavení je pole backing-store pro deklaraci události delegát vícesměrového vysílání, který sériově kombinuje všechny obslužné rutiny událostí. To znamená, že pokud dokončení jedné obslužné rutiny trvá dlouho, zablokuje ostatní obslužné rutiny, dokud se dokončí. (Obslužné rutiny událostí, které se dobře chovají, by nikdy neměly provádět zdlouhavé nebo potenciálně blokující operace.)
Místo použití výchozí implementace událostí, které Visual Basic poskytuje, můžete použít vlastní událost ke spuštění obslužných rutin událostí asynchronně.
Příklad
V tomto příkladu přistupovač AddHandler
přidá delegáta pro každou obslužnou rutinu Click
události do ArrayList uloženého EventHandlerList
v poli.
Když kód vyvolá Click
událost, RaiseEvent
příslušenství vyvolá všechny obslužné rutiny události asynchronně pomocí BeginInvoke metody. Tato metoda vyvolá každou obslužnou rutinu v pracovním vlákně a vrátí okamžitě, takže obslužné rutiny nemohou navzájem blokovat.
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