Megosztás a következőn keresztül:


Útmutató: Egyéni események deklarálása a blokkolás elkerülése érdekében (Visual Basic)

Számos olyan körülmény van, amikor fontos, hogy egy eseménykezelő ne tiltsa le a későbbi eseménykezelőket. Az egyéni események lehetővé teszik, hogy az esemény aszinkron módon hívja meg az eseménykezelőket.

Alapértelmezés szerint az eseménydeklaráció háttértároló mezője egy csoportos küldésű meghatalmazott, amely sorosan egyesíti az összes eseménykezelőt. Ez azt jelenti, hogy ha az egyik kezelő végrehajtása hosszú időt vesz igénybe, addig blokkolja a többi kezelőt, amíg be nem fejeződik. (A jól viselkedő eseménykezelőknek soha nem szabad hosszadalmas vagy potenciálisan blokkoló műveleteket végrehajtaniuk.)

A Visual Basic által biztosított események alapértelmezett implementálása helyett egyéni eseményekkel aszinkron módon hajthatja végre az eseménykezelőket.

Példa

Ebben a példában a AddHandler kiegészítő hozzáadja az esemény minden kezelőjének delegáltját Click a EventHandlerList mezőben tároltakhozArrayList.

Amikor a kód elindítja az Click eseményt, a kiegészítő az RaiseEvent összes eseménykezelő delegáltat aszinkron módon hívja meg a BeginInvoke metódus használatával. Ez a metódus meghívja az egyes kezelőket egy feldolgozó szálon, és azonnal visszatér, így a kezelők nem tudják blokkolni egymást.

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

Lásd még