Delen via


Procedure: Aangepaste gebeurtenissen declareren om blokkeren te voorkomen (Visual Basic)

Er zijn verschillende omstandigheden waarin het belangrijk is dat een gebeurtenis-handler de volgende gebeurtenis-handlers niet blokkeert. Met aangepaste gebeurtenissen kan de gebeurtenis asynchroon de gebeurtenis-handlers aanroepen.

Standaard is het veld backing-store voor een gebeurtenisdeclaratie een multicast-gemachtigde die alle gebeurtenis-handlers serieel combineert. Dit betekent dat als de ene handler lang duurt om te voltooien, de andere handlers worden geblokkeerd totdat deze is voltooid. (Goed opgevoede gebeurtenis-handlers mogen nooit langdurige of mogelijk blokkerende bewerkingen uitvoeren.)

In plaats van de standaard implementatie te gebruiken van gebeurtenissen die Visual Basic biedt, kunt u een aangepaste gebeurtenis gebruiken om de gebeurtenis-handlers asynchroon uit te voeren.

Opmerking

In dit voorbeeld voegt de AddHandler toegangsfunctie de gemachtigde voor elke handler van de Click gebeurtenis toe aan een ArrayList opgeslagen in het EventHandlerList veld.

Wanneer de code de Click gebeurtenis genereert, roept de RaiseEvent accessor alle gebeurtenishandlers asynchroon aan met behulp van de BeginInvoke methode. Deze methode roept elke handler aan op een werkrolthread en retourneert onmiddellijk, zodat handlers elkaar niet kunnen blokkeren.

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

Zie ook