Ú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