|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 77
|
[C#] Delegate e control.BeginInvoke
Vorrei capirci qualcosa di più...
Mi postate un esempio copia e incolla funzionante per modificare un text da un thread diverso dal main? |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Nov 2008
Messaggi: 136
|
Mi associo alla richiesta, è un argomento che ho provato a imparare molte volte anche se senza successo.
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
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.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 21-02-2011 alle 19:34. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:59.



















