Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í asynchronní volání obslužných rutin.
Ve výchozím nastavení je pole pro zálohování u deklarace události delegát pro vícesměrové 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čí. Dobře se chovající obslužné rutiny událostí 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 ve EventHandlerList poli.
Když kód vyvolá Click událost, RaiseEvent přistupující prvek asynchronně vyvolá všechny delegáty obslužných rutin události pomocí metody BeginInvoke. Tato metoda vyvolá každou obslužnou rutinu v pracovním vlákně a okamžitě se vrátí, 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