Guide C# – Gestione Thread-Safe dei Thread

Molto spesso lavorando con le GUI (interfacce grafiche) in C# con il Framework 2.0, capita di dover modificare controlli da un altro thread. Questo tipo di gestione non è sbagliato come può sembrare, tanto che è un comportamento normale ad esempio nel caso descritto qui sotto:

problema coi thread

Più semplicemente, succede che il gestore di un evento scatenato su di un thread viene gestito da quel thread anche se si trova nel codice del thread principale, quindi se in quel codice voglio modificare il valore di un controllo devo fare in modo di utilizzare un codice thread-safe. Cosa significa questo? È molto semplice. Fino al Framework 1.1 era possibile cambiare ad esempio il valore di testo di una Label da un Thread diverso. Con il Framework 2.0 questo non è più possibile, per ragioni di sicurezza interna.

Ecco quindi che ci vengono in aiuto i delegati. Come si può immaginare, un delegato è qualcosa che ci viene in aiuto per risolvere un problema, qualcuno a cui chiediamo di fare qualcosa per noi. Nel vecchio C sarebbe stato qualcosa come passare ad una funzione l’indirizzo di un’altra funzione come parametro, oppure in VB sarebbe una sorta di addressof. Essendo il C# ad oggetti per definizione, ecco allora che tutti questi “trucchi” vengono ritradotti in oggetti, i delegati appunto.

Supponiamo di voler modificare il codice di una TextBox da un altro thread, dichiariamo quindi un nuovo semplice delegato:

private delegate void changeTextDelegate(string newText);

a questo punto creiamo una funzione che svolgerà il compito di cambiare il testo:

private void ChangeText(string newText)
{
if (myTextBox.InvokeRequired)
{
myTextBox.Invoke(new changeTextDelegate(ChangeText), newText);
return;
}
myTextBox.Text = newText;
}

Successivamente, nel gestore dell’evento chiameremo semplicemente la funzione ChangeText passando come parametro il nuovo testo da visualizzare. In questo modo, quando il gestore nell’altro thread entrerà nella funzione, la InvokeRequired sarà true per via del fatto che si trova in un thread diverso da quello in cui si trova la TextBox, così chiederà alla TextBox stessa di invocare il metodo stesso attraverso il delegato passandogli come parametro il nuovo testo per poi uscire con il return. A questo punto la nuova invocazione avverrà nel thread giusto, la InvokeRequired restituirà false e il codice continuerà settando il valore della TextBox a newText. Se non vi è chiaro qualcosa, chiedete pure nei commenti. Buon lavoro! ok emoticon

This entry was posted in Linguaggi .Net, Programmazione and tagged , , , , , , , , , , , , , , . Bookmark the permalink.

6 Responses to Guide C# – Gestione Thread-Safe dei Thread

  1. Hola estan padres las notas, ya hemos leido varias, el italiano es muy parecido al español, de hecho la de egypt en 3D esta interesante, y que padre que apoyes en cuanto a código se refiere.
    Nosotros somos estudiantes de ingeniería en diseño gráfico digital, y al igual que tu, estamos realizando un blog, en nuestro caso es un blog periódico, en el que recopilamos información de lo más interesante y nuevo relacionado con tecnología en cualquier ámbito, de hecho tenemos pensado en un futuro tener organizadas las noticias por secciones. Agradeceríamos mucho tu opinión sobre el blog y las noticias que llevamos publicadas. Nuestro blog se llama “Geekdget News” y la liga es http://geekdget.blogspot.com

    Atte.
    Adriana Zapata & Alfredo Salazar
    Geekdget News Admin
    Monterrey Nuevo León México

  2. Massimiliano says:

    Grazie x l’aiuto!!!
    Problema dovuto dal passaggio con relativa conversione in automatico dal vs.net a vs 2005… stralol emoticon

  3. Anonimo says:

    Ti ringrazio per l’aiuto che mi hai offerto, il tuo articolo è stato molto chiaro e mi è servito per risolvere un problema che mi stava risucchiando
    Grazie stralol emoticon

  4. Denis says:

    @Anonimo e Massimiliano: Davvero felice di esservi stato d’aiuto. Se avete ancora bisogno, chiedete pure ok emoticon

  5. Walter says:

    scusa la banalità, ma potresti fare un esempio relativo al gestore dell’evento e come richiamarlo dal thread?
    per un principiante la strada e’ sempre in salita!

  6. Osamu says:

    Ho un metodo che ha come valore di ritorno una stringa e come parametri espliciti una progressbar, dovrei eseguirlo in un nuovo thread, come posso fare?

    Creo una nuova istanza della classe in cui è contenuto il metodo che va ad impostare il testo di una textbox e il ciclo interno va ad aggiornare una progressbar, però voglio che venga eseguito in un altro thread.

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>