Scenario: Avete una classe, la quale ha un metodo che attraverso un thread (oppure usando un delegate e BeginInvoke, EndInvoke) svolge alcune operazioni asincrone, all'interno di questo thread volete generare degli eventi, e all'interno di questi eventi volete aggiornare l'interfaccia utente.
Il problema sta nel generare l'evento nel thread principale per non costringere chi usa la vostra classe a usare ISyncronizeInvoke per effettuare il marshaling della chiamata.
Ecco la soluzione:

 Public Class Test
  '//Definisco l'evento
  Public Delegate Sub MyInvoker(ByVal Value As Int32)
  Public Event Progress As MyInvoker
  Private mThread As Thread

  Public Sub DoItInAnotherThread()
   mThread = New Thread(AddressOf Count)
   mThread.Start()
  End Sub

  Private Sub Count()
   '//Recupero il field associato al mio evento (NomeEvento+[Event])
   Dim del As MyInvoker = Me.ProgressEvent
   If (Not del Is Nothing) Then
    '//Recupero l'oggetto associato al mio delegate...
    Dim Invoke As ISynchronizeInvoke = DirectCast(del.Target, ISynchronizeInvoke)
    '//Invoke=nothing se il gestore e' static
    If (Not Invoke Is Nothing) Then
     For i As Int32 = 0 To 100
      Invoke.Invoke(del, New Object() {i})
     Next
    End If
   End If
  End Sub
 End Class

Attenzione: Non funziona se il gestore evento e' un metodo statico in quanto il relativo Target e' null... :-(