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

Viz také