il problema è che i controlli UI devono essere mossi dal Thread originale con cui il form è stato aperto.
Hai diverse soluzioni a riguardo, la migliore è la reflection, ti passo un esempio che puoi copiare ed incolare nel tuo codice.
Per esempio questa è una funzione che aggiorna una progress bar:
delegate void SetRefreshCallback(int n);
private void BarUpdate(int sim)
{
if (this.progressBarSimulation.InvokeRequired)
{
SetRefreshCallback d = new SetRefreshCallback(BarUpdate);
this.Invoke(d, new object[] { sim });
}
else
{
progressBarSimulation.Value = (int)(sim * barScale);
progressBarSimulation.Refresh();
}
}
sta nel Form1.cs per esempio.
Da qui noti che se richiami la funzione dal Thread origine del form allora enstri nell'else, altrimenti se l'invoke Required restituisce true (entrando nell'if) significa che l'ID del thread corrente, è diverso dall'ID del thread nativo del controllo che vuoi manipolare.
Questo evita tutti gli errori cross-thread.
ciao
Alessandro Parma