Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET 2.0] Eccezione uso controllo con BackgroundWorker
Forum - C# / VB.NET - [VB.NET 2.0] Eccezione uso controllo con BackgroundWorker

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Buongiorno,
Sto lavorando su un controllo TreeView in un thread separato,
quando eseguo questa riga di codice
Codice sorgente - presumibilmente Plain Text

  1. twFiles.Nodes.Add(Me.Server.URI.ToString)


Mi lancia un'eccezione di tipo InvalidOperationException con la seguente descrizione:

L'azione da eseguire sul controllo è stata chiamata dal thread sbagliato. Per eseguire l'operazione, è necessario eseguire il marshalling del thread appropriato, utilizzando Control.Invoke o Control.BeginInvoke.

Non ho capito cosa devo fare per risolverla, e sinceramente nemmeno da cosa è causata :asd:
Qualcuno mi può aiutare?

Ciao e grazie a chi mi risponderà:k:

Qwertj

EDIT: Ho provato il codice di HeDo, ma mi ridà lo stesso identico errore nella stessa riga. Questo è il codice
Codice sorgente - presumibilmente VB.NET

  1. Delegate Sub DelTwFiles(ByVal Node As TreeNode)
  2.  
  3.     Private Sub TwFilesSub(ByVal Node As TreeNode)
  4.         If twFiles.InvokeRequired Then
  5.             twFiles.Invoke(New DelTwFiles(AddressOf TwFilesSub), Node)
  6.         End If
  7.     End Sub


Ho sbagliato qualcosa?

Ultima modifica effettuata da il 06/02/2011 alle 9:53
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2764
Iscritto: 21/09/2007

Up
2
Down
V
Segnala al moderatore
Postato alle 0:58
Domenica, 06/02/2011
ogni oggetto GUI può essere modificato solo dal thread in cui è venuta la sua creazione. detto questo, un workaround è quello di passare per un metodo helper che fa uso di un delegate per schedulare l'azione sulla proprietà.
Il codice è molto più semplice :D


Codice sorgente - presumibilmente C#

  1. delegate void SetTextDelegate(string Text);
  2. void SetText(string Text) {
  3.     if (txtBox.InvokeRequired)
  4.         txtBox.Invoke(new SetTextDelegate(SetText), Text);
  5.     else
  6.         txtBox.Text = Text;
  7. }




questo è un metodo helper che permette di modificare il testo di una textbox di nome "txtBox" da qualsiasi thread.

Lo stesso principio è applicabile a tutte le proprietà/metodi di tutti i controlli, basta solo scriversi gli appositi helpers.

Ultima modifica effettuata da HeDo il 06/02/2011 alle 0:58
;) - giovannibart91 - 06/02/11 03:16


Ingegnere Informatico
https://ldlagency.it
PM
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 23:19
Sabato, 05/02/2011
In poche parole, non puoi modificare controlli e proprietà dei controlli di un form da un thread che non è quello che ha "lanciato" il form.
Es.

Il thread "A" ha lanciato il form e lo gestisce, con il Thread "B" creato dal BackGroundWorker NON puoi modificare la Form e i suoi controlli, DEVI usare per forza il Thread "A"...


Il software è come il sesso, è meglio quando è libero.
Linus Torvalds, Conferenza della Free Software Foundation, 1996 (attribuito)

Non provare mai a spiegare il computer a un profano. È più facile spiegare il sesso a una vergine.
Robert Anson Heinle
PM
Usa i commenti per chiedere spiegazioni o ringraziare le risposte.