venerdì 2 dicembre 2011

Modificare lo stato di un controllo da un operazione asincrona .NET

Quante volte avete avuto la necessità di aggiornare un controllo che si trova su una form istanziata dal thread principale dell'applicazione, da un altro thread che sta seguendo un operazione asincrona? Ecco come evitare errori di cross thread e non duplicare il codice:
//C#
private delegate void InvokeMiaFunzione();
private InvokeMiaFunzione mInvokeMiaFunzione;

private void MiaFunzione()
{
 if (this.InvokeRequired)
 {
  this.Invoke(mInvokeMiaFunzione);
 }
 else
 {
  // Qui si può modificare lo stato del controllo della form senza incorrere in nessun problema
 }
}

private void CostruttoreDellaClasse()
{
 mInvokeMiaFunzione = new InvokeMiaFunzione(MiaFunzione);
}

//Chiamata da un processo asincrono
private void ProcessoAsincrono()
{
 MiaFunzione();
}

//Chiamata da un processo sincrono
private void ProcessoSincrono()
{
 MiaFunzione();
}
'VB
Private Delegate Sub InvokeMiaFunzione()
Private mInvokeMiaFunzione As InvokeMiaFunzione

Private Sub MiaFunzione()
    If Me.InvokeRequired Then
        Me.Invoke(mInvokeMiaFunzione)
    Else
        'Qui si può modificare lo stato del controllo della form senza incorrere in nessun problema
    End If
End Sub

Private Sub CostruttoreDellaClasse()
    mInvokeMiaFunzione = AddressOf MiaFunzione
End Sub

'Chiamata da un processo asincrono
Private Sub ProcessoAsincrono()
    MiaFunzione()
End Sub

'Chiamata da un processo sincrono
Private Sub ProcessoSincrono()
    MiaFunzione()
End Sub