[VB.NET] Problema multithreading -safe thread

lunedì 11 dicembre 2006 - 22.09

forno Profilo | Junior Member

Ciao a tutti, ho un problema molto classico nel Multithreading. Il classico errore causato da controlli unsafe-thread. Questa volta però sono in crisi prché a differenza delle altre volte l'errore viene generato in un ciclo, in una variabile contenente dati presi da una listview.

Semplificando un po' ho un codice come:
Dim Itm As ListViewItem For Each Itm In FileList.SelectedItems .... End For
L'errore "Cross-thread operation not valid: Control 'FileList' accessed from a thread other than the thread it was created on." mi viene indicato nella riga dove il ciclo ha inizio, ovvero For Each Itm In FileList.SelectedItems

Ho visto vari articoli, ma nessuno indica come risolvere questo tipo di problema.

Graize
Ciao

freeteo Profilo | Guru

ciao,
è il classico problema del multithreading con oggetti UI, che per come è progettato il framework e in particolare i controlli, non è possibile per motivi di sicurezza.

L'unico Thread che puo' accedere ai controlli della form è quello che ha creato i controlli, quindi diciamo il thread principale con cui è partita l'applicazione, quindi devi usare o qualche arzigogolato delegate, oppure per poco codice, una cosa simpatica: Il metodo "invoke" degli oggetti.

Qualcosa del tipo:
.... ListBox1.Invoke(New MethodInvoker(AddressOf riempi)) End Sub Private Sub riempi() For Each str In ListBox1.SelectedItems ....
cosi' facendo essendo il listbox1 (controllo della form) ad interagire con i controlli, il gioco funziona, perche' è stato creato dallo stesso thread degli altri (appunto il principale).
E' un trucchetto che io uso quando ho poco codice da fare, cosi' mi posso velocizzare il lavoro...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

totti240282 Profilo | Guru

bè alla fine è quasi come usare i delegati
C'è solo un capitano !!!!!!

forno Profilo | Junior Member

Grazie mille, ho risolto!
Alla prossima
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5