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
Nessun commento:
Posta un commento