Un controllo WindowForms può essere modificato solo dal thread che l'ha creato, quindi per poterlo moificare da un altro thread bisogna creare un delegate che deve essere passato al form tramite il metodo invoke, tale metodo non fa altro che eseguire il delagate nel proprio thread.
andiamo al codice:
bisogna prima creare il delegate:
codice:
public delegate void aggiornaLabel(string str, Label label);
questo delegate accetta in ingresso la stringa che vuoi inserire nel label e il label, in modo che puoi riutillizzarlo anche per altri label. (Il Delegate va inserito al di fuori della classe, così lo puoi utilizzare ovunque)
Ora hai bisogno di un metodo per poter istanziare il delegate, il metodo deve aver gli stesi tipi di argomenti:
codice:
public void updateLabel(String str, Label label)
{
label.Text = str;
}
questo metodo lo puoi inserire dove vuoi ma per come ti scriverò la prossima parte deve stare nella classe form.
ora non ci resta che passare al metodo invoke dell'istanza della classe form l'istanza del delegate:
codice:
this.myform.Invoke(new aggiornaLabel(this.form.updateLabel), "mia Stringa", this.myform.myLabel);
per poter capire il concetto devi capire bene che sono i delegate e come utillizzarli,
il concetto di base è questo:
I delegate ci permettono di passare un metodo ad altri metodi come argomento
altri linguaggi permettono di farlo diversamente es
Action Script di Flash ha un tipo "Function" che ci permette di mettere un metodo in una variabile di quel tipo.
PHP come anche il c ha i metoi callback che permettono di chiamare un metodo tramite una stringa
a io parere l'approccio ActionScript è olto più semplice