Sdílet prostřednictvím


Postupy: Deklarace vlastních událostí, aby se zabránilo 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í 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

Viz také