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 een gebeurtenis zijn handlers asynchroon 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. Correct functionerende eventhandlers 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.

Voorbeeld

In dit voorbeeld voegt de AddHandler accessor de "delegate" voor elke handler van de Click event toe aan een ArrayList die opgeslagen is 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 werkdraad en retourneert onmiddellijk, zodat de 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