| hoofdstuk |
23. 24. 25.  |
| onderwerp |
24.3. 24.4. Custom Events 24.5.  |
| rubrieken | - |
Dit artikel is gepubliceerd op zondag 31 juli 2011 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 2010 Broncode 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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Start of Example1.SomeEventHandler1 ...
<thread sleeps for 5 seconds>
... end of Example1.SomeEventHandler1
Example1.SomeEventHandler2 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 m_SomeEventList ) bewaren, kunnen we elke handler in de RaiseEvent accessor met BeginInvoke invokeren. BeginInvoke zal deze handler op een aparte workerthread uitvoeren. Hierdoor zal geen enkele handler een andere ophouden. Visual Basic 2010 Broncode Namespace Example2 Class SomeEventSource Private m_SomeEventList As New ArrayList Public Custom Event SomeEvent As Eventhandler AddHandler( ByVal value As EventHandler) m_SomeEventList.Add(value) End AddHandler RemoveHandler( ByVal value As EventHandler) m_SomeEventList.Remove(value) End RemoveHandler RaiseEvent( ByVal sender As Object, ByVal e As System. EventArgs) For Each handler As EventHandler In m_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) 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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|