PDA

View Full Version : [C#] Delegate e control.BeginInvoke


ivan68
21-02-2011, 09:23
Vorrei capirci qualcosa di pių...

Mi postate un esempio copia e incolla funzionante per modificare un text da un thread diverso dal main?

:muro:

s1m0_93
21-02-2011, 15:27
Mi associo alla richiesta, č un argomento che ho provato a imparare molte volte anche se senza successo. :D

gugoXX
21-02-2011, 18:29
Solo il thread che ha creato il controllo puo' cambiarne i valori grafici relativi.
Per farlo e' sufficiente passare attraverso il dispatcher del controllo.

Sotto Winform
{
BeginInvoke(new Action( ()=> { codiceDalanciare(); } ) );
}

Sotto WPF
{
Dispatcher.BeginInvoke(new Action( ()=> { codiceDalanciare(); } ) );
}

Ovvero, BeginInvoke, a cui si "passa" il pezzo di codice da eseguire in modo sincrono da parte del Thread del controllo.

BeginInvoke non attende il risultato, ovvero la chiamata non e' bloccante.
Invoke invece attende che il codice termini, ed eventualmente restituisce al thread chiamante anche un risultato dell'operazione (ovvero se il codiceDaLanciare restituisce qualcosa).
Tipico uso della Invoke e' quando si "legge" il valore di un subcontrol.

Attenzione alle sincronizzazioni tra diversi thread oltre quello del controllo.
Poiche' BeginInvoke e' asincrona e non attende l'esecuzione (ovvero semplicmente mette in coda un qualcosa da eseguire da parte del Dispatcher), circondarla con una lock(asdf){ } o con altri metodi di sincronizzazione, non serve a nulla.