Operazione cross-thread non valida

venerdì 08 maggio 2009 - 15.23

Luigi3 Profilo | Junior Member

Ciao a tutti,

ho portato un'applicazione windows da .net 2003 a .net 2005.
E' un programma multithread che ha dei componenti comuni (ad esempio una textbox) sulla quale i vari thread scrivono. Per farlo ho creato una classe a parte alla quale arrivano le chiamate dai thread e che si occupa di aggiungere una riga a questa textbox.
Con il 2003 tutto ok, adesso con il 2005 ho un errore: "Operazione cross-thread non valida".
Ho letto che è possibile disattivare questa sorta di controllo, ma non ho ben capito come. qualcuno potrebbe farmi un piccolo esempio pratico?

Grazie!!!

Jeremy Profilo | Guru

Ciao Luigi
>Con il 2003 tutto ok, adesso con il 2005 ho un errore: "Operazione
>cross-thread non valida".
Probabilmente il problema esisteva anche prima ma tu avevi disattivato questo tipo di controllo, oppure, hai usato la conversione automatica che ha fatto qualche casino.
>Ho letto che è possibile disattivare questa sorta di controllo,
Non farlo .... comincia a farci capire se, nella tua applicazione Multithreading, hai fatto uso dei delegate ... e se l'applicazione è così tanto complessa da non poterla *aggiustare*.

Facci sapere..
Ciao

freeteo Profilo | Guru

Ciao,
il modo più veloce ma sicuramente pessimo dal punto di vista prestazioni, è impostare:
Control.CheckForIllegalCrossThreadCalls = false;

Chiaramente sarebbe meglio usare l'invoke etc...ma se vuoi provare con questa piccola modifica da mettere nella form, potresti fare prima.

Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Luigi3 Profilo | Junior Member

Ciao Jeremy grazie per la velocissima risposta.

Allora la conversione è stata fatta in automatico quindi sicuramente ci sarà stato qualche casino.

Si in effetti se riuscissi a risolvere in maniera piu' adeguata il problema sarebbe sicuramente meglio. Ti dico che non faccio uso di delegate e che l'applicazione non è niente di complesso.

Ho un form nel quale è contenuto una textbox multilinea che rappresenta un event log dell'applicazione stessa. Ogni volta che inizia o finisce un thread o in caso di errori, in questa textbox faccio scrivere un messaggio.
All'interno del thread ho questa chiamata:
AlertSystem.WriteLog(IsTraceActive, ref strLog, this.Config.Machine, LogType.TRACE, MessageType.Generic, tb);
tb è il controllo "incriminato".
In questa riga ottengo l'errore:
tb.AppendText (Message);

Attendo vostri consigli

Jeremy Profilo | Guru

Ciao Luigi.

Non vedendo tutto il codice, non posso dirti molto.

Intanto, comunque, dovresti modificare il codice in questo modo:

delegate void dl(string text); private void RoutineCheGiraInThreadSeparato() { this.Invoke(new dl(ScriviTextBox, Message)); } private void ScriviTextBox(string text) { tb.AppendText(text); }
Il codice che ti ho postato mostra l'utilizzo del delegate per accedere ad un controllo gestito dal thread principale(o comunque da un altro thread).
Sicuramente non basta ad *aggiustare* la tua applicazione, però potrebbe essere un punto di partenza.
Comunque rimango a disposizione per ulteriori info.

Facci sapere....
Ciao.

Luigi3 Profilo | Junior Member

Sicuramente l'uso dei Delegate dovrebbe migliorare la situazione. Purtroppo non li ho mai utlizzati ma vorrei capire bene come funzionano.

Cerco di spiegare meglio la mia situazione.

Ho tre classi: Main, ThreadManager e AlertSystem.

La classe Main lancia i thread. La classe ThreadManager contiene il codice che eseguono i thread tra cui il richiamo di una funzione contenuta nella classe AlertManager.

Potresti spiegarmi meglio come strutturare il codice per il richiamo della funzione invoke?

Jeremy Profilo | Guru

Ciao Luigi.
prova a vedere se questo post può chiarirti un pò le idee sul compito dei delegate:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=27911.

Per quanto riguarda la tua richiesta di aiuto, dovresti postare un pò più di codice o, per lo meno, allegare un progettino per poterlo visionare e correggere.

Facci sapere
Ciao
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5