Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Greenpeace
Cross-threading con InvokeRequired in .NET
Scritto da Rocco Galati il 02-05-2011 ore 07:10
Intel Cluster Studio XE
Quando si sviluppa un'applicazione e si sceglie di utilizzare il multithreading per migliorare le prestazioni dei controlli dell'interfaccia occorre fare attenzione, affinché le operazioni che si alternano sullo stesso controllo non generino race condition e, più in generale, confitti tra thread.

Uno degli errori più comuni a cui si deve far fronte in questi casi è InvalidOperationException, ed è relativo a situazioni in cui si cerca di accedere a un controllo creato da un thread all'interno di un altro thread.

Ali Tarhini affronta questo tema nel suo blog proponendo un esempio di codice, che genera l'errore appena citato:
  1. Dim nuovo_thread As New Threading.Thread(AddressOf test)
  2.  
  3.  
  4. Private Sub test()
  5.     TextBox1.Text = "using textbox from another thread"
  6. End Sub
  7.  
  8. Private Sub Form1_Load(ByVal sender As System.Object, _
  9.  ByVal e As System.EventArgs) Handles MyBase.Load
  10.      nuovo_thread.Start()
  11. End Sub
Infatti, il thread nuovo_thread tenta di eseguire l'accesso al controllo TextBox1 che appartiene, invece, al thread principale.

Per risolvere il problema, bisogna implementare un meccanismo di context switching e di prevenzione del deadlock, come si è già detto in precedenti articoli. Il framework .NET mette a disposizione la proprietà InvokeRequired: essa restituisce un valore che indica se il chiamante deve invocare un metodo a parte o meno, a seconda che il controllo appartenga al thread corrente o sia stato creato da un altro.

Nel suo articolo, Tarhini mostra con un ulteriore spezzone di codice come sia possibile applicare la proprietà per evitare il verificarsi dell'errore.
Precedente: Opus, un codec audio open source a bassa latenza
Successiva: Applicazioni pratiche della fisica quantistica: l'effetto tunnel (12/15)
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.27 secondi.