Sappiamo che nel .Net Framework è vietato l'accesso ad un controllo da un thread diverso da quello in cui il controllo stesso è stato creato. Il framework solleva una InvalidOperationException se si tenta una simile operazione. Per aggiornare (ad esempio) l'interfaccia utente con le informazioni provenienti da un thread in esecuzione in background dobbiamo utilizzare l'interfaccia ISynchronizeInvoke, come spiegato ad esempio in http://msdn2.microsoft.com/en-us/library/ms171728.aspx. Se abbiamo diverse proprietà di diversi controlli che necessitano di essere aggiornate da thread differenti, potrebbe essere oneroso definire un metodo delegato per ciascuna, un metodo che verifica la proprietà InvokeRequired e un metodo che costituisca l'istanza del delegato. Per ovviare a tutto questo possiamo utilizzare una classe che prenda nel costruttore in ISynchronizeInvoke a cui delegare le chiamate cross-thread, come ho cercato di spiegare nell'articolo: http://www.codeproject.com/useritems/ISinchronizedInvoke.asp.