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... :-(