Figure 2 Multiple Event Handlers
' From frmMain.vb
Private Sub EventHandler2( _
  ByVal NewFile As System.IO.FileInfo) _
    Handles fs2.FileFound, fs3.FileFound, fs4.FileFound

    AddText("EventHandler2: " & NewFile.FullName)
End Sub

Private Sub EventHandler3( _
  ByVal NewFile As System.IO.FileInfo) _
    Handles fs2.FileFound, fs3.FileFound, fs4.FileFound

    AddText("EventHandler3: " & NewFile.FullName)
End Sub

Figure 4 One Event Handler Raises an Error
' From frmMain.vb
Private Sub EventHandler2( _
  ByVal NewFile As System.IO.FileInfo) _
    Handles fs2.FileFound, fs3.FileFound, fs4.FileFound

    AddText("EventHandler2: " & NewFile.FullName)
End Sub

Private Sub EventHandler3( _
  ByVal NewFile As System.IO.FileInfo) _
    Handles fs2.FileFound, fs3.FileFound, fs4.FileFound

    AddText("EventHandler3: " & NewFile.FullName)
End Sub

Private Sub EventHandler4( _
  ByVal NewFile As System.IO.FileInfo) _
    Handles fs3.FileFound, fs4.FileFound

    AddText("EventHandler4: Throwing exception!")
    Throw New ArgumentException
End Sub

Figure 6 RaiseEvent Compiled to MSIL


Figure 7 Catch Errors for Each Listener
' From FileSearch4.vb
Dim ListenerList() As System.Delegate
Dim Listener As FileFoundEventHandler
ListenerList = FileFoundEvent.GetInvocationList()

' Search for matching file names.
Dim afi() As FileInfo = diLocal.GetFiles(Me.FileSpec)

For Each fi As FileInfo In afi
    For Each Listener In ListenerList
        Try
            Listener.Invoke(fi)
        Catch
            ' Something goes wrong? Just move on to 
            ' the next event handler.
        End Try
    Next
    alFiles.AddRange(afi)
Next

Figure 8 FileFoundEventArgs Class
' From FileFoundEventsArgs.vb
Public Class FileFoundEventArgs
    Inherits EventArgs

    Private mfi As FileInfo

    Public ReadOnly Property FileFound() As FileInfo
        Get
            Return mfi
        End Get
    End Property

    Public Sub New(ByVal fi As FileInfo)
        ' Store the FileInfo object for later use.
        mfi = fi
    End Sub
End Class

Figure 10 Generated Empty Event
Public Custom Event FileFound As FileFoundEventHandler

    AddHandler(ByVal value As FileFoundEventHandler)

    End AddHandler

    RemoveHandler(ByVal value As FileFoundEventHandler)

    End RemoveHandler

    RaiseEvent(ByVal sender As Object, ByVal e As FileFoundEventArgs)

    End RaiseEvent
End Event

Figure 11 The Custom Event
Private listeners As New List(Of FileFoundEventHandler)

Public Custom Event FileFound As FileFoundEventHandler
    AddHandler(ByVal value As FileFoundEventHandler)
        listeners.Add(value)
    End AddHandler
 
    RemoveHandler(ByVal value As FileFoundEventHandler)
        If listeners.Contains(value) Then
            listeners.Remove(value)
        End If
    End RemoveHandler
 
    RaiseEvent(ByVal sender As Object, ByVal e As FileFoundEventArgs)
        For Each listener As FileFoundEventHandler In listeners
            Try
                listener.Invoke(sender, e)
            Catch ex As Exception
                ' Something goes wrong? Just move on to the next handler.
            End Try
        Next
    End RaiseEvent
End Event