Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

24.4. Custom Events

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Eventhandler zouden nooit "langdurige" operaties mogen uitvoeren.

Als een event van een eventsource aan meerdere eventhandlers is gekoppeld, kan een "langdurige" eventhandler (eentje die veel tijd in beslag neemt om uit te voeren) alle volgende eventhandler tijdelijk blokkeren.
Visual Basic 2012 Broncode - Codevoorbeeld 643
Namespace Example1
    Class SomeEventSource
        Public Event SomeEvent()
        Public Sub RaiseSomeEvent()
            RaiseEvent SomeEvent()
        End Sub
    End Class
    Class Client
        Public Shared Sub Main()
            Dim someEventSource As New SomeEventSource
            '
            AddHandler someEventSource.SomeEvent, AddressOf SomeEventHandler1
            AddHandler someEventSource.SomeEvent, AddressOf SomeEventHandler2
            '
            someEventSource.RaiseSomeEvent()
            '
            Console.ReadLine()
        End Sub
        Public Shared Sub SomeEventHandler1()
            Console.WriteLine("Start of Example1.SomeEventHandler1 ...")
            System.Threading.Thread.Sleep(5000)
            Console.WriteLine("... end of Example1.SomeEventHandler1")
        End Sub
        Public Shared Sub SomeEventHandler2()
            Console.WriteLine("Example1.SomeEventHandler2")
        End Sub
    End Class
End Namespace
Console Application Output
Start of Example1.SomeEventHandler1 ...
<thread sleeps for 5 seconds>
... end of Example1.SomeEventHandler1
Example1.SomeEventHandler2
Eventhandler someEventHandler2 wordt hier pas uitgevoerd nadat de "langdurige" someEventHandler1 is beëindigd.

Een oplossing hiervoor kan eruit bestaan een "custom event" te definiëren.
Deze laat je toe via de RaiseEvent, AddHandler en RemoveHandler accessors te bepalen wat er respectievelijk gebeurt bij het raisen van de event, bij het koppelen en loskoppelen van een eventhandler aan of van de event.

Als we de eventhandlers niet in een multicast delegate instantie combineren, maar bijvoorbeeld elk apart als element in een collectie ( hier _SomeEventList) bewaren, kunnen we elke handler in de RaiseEvent accessor met BeginInvoke invokeren.
Method BeginInvoke zal deze handler op een aparte workerthread uitvoeren.  Hierdoor zal geen enkele handler een andere ophouden.
Visual Basic 2012 Broncode - Codevoorbeeld 644
Namespace Example2
    Class SomeEventSource
        Private _SomeEventList As New ArrayList
        Public Custom Event SomeEvent As Eventhandler
            AddHandler(ByVal value As EventHandler)
                _SomeEventList.Add(value)
            End AddHandler
            RemoveHandler(ByVal value As EventHandler)
                _SomeEventList.Remove(value)
            End RemoveHandler
            RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
                For Each handler As EventHandler In _SomeEventList
                    If handler IsNot Nothing Then
                        handler.BeginInvoke(sender, e, Nothing, Nothing)
                    End If
                Next
            End RaiseEvent
        End Event
        Public Sub RaiseSomeEvent()
            RaiseEvent SomeEvent(Me, System.EventArgs.Empty)               ' (1)
        End Sub
    End Class
    Class Client
        Public Shared Sub Main()
            Dim someEventSource As New SomeEventSource
            '
            AddHandler someEventSource.SomeEvent, AddressOf SomeEventHandler1
            AddHandler someEventSource.SomeEvent, AddressOf SomeEventHandler2
            '
            someEventSource.RaiseSomeEvent()
            '
            Console.ReadLine()
        End Sub
        Public Shared Sub SomeEventHandler1(ByVal sender As Object, _
                                            ByVal e As EventArgs)
            Console.WriteLine("Start of Example2.SomeEventHandler1 ...")
            System.Threading.Thread.Sleep(5000)
            Console.WriteLine("... end of Example2.SomeEventHandler1")
        End Sub
        Public Shared Sub SomeEventHandler2(ByVal sender As Object, _
                                            ByVal e As EventArgs)
            Console.WriteLine("Example2.SomeEventHandler2")
        End Sub
    End Class
End Namespace
Console Application Output
Start of Example2.SomeEventHandler1 ...
Example2.SomeEventHandler2
<thread sleeps for 5 seconds>
... end of Example2.SomeEventHandler1
Bij het raisen van een event (1) als e een EventArgs.Empty doorgeven, komt neer op het aangeven dat er geen "eventargumenten" zijn.

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.