2009-08-30 12 views
6

Sto scrivendo un'applicazione per finestre di ricerca file che cercherà le modifiche in una cartella specificata e quindi registra i dettagli in un file txt.Operazione cross-thread non valida: controllo a cui si accede da un thread diverso dal thread creato su

ho seguito esattamente ciò che viene menzionato in questo articolo di seguito http://www.codeproject.com/KB/dotnet/folderwatcher.aspx

Quando mi ha colpito F5 dalla mia applicazione e quindi creare o modificare un file nella cartella che viene guardato getta l'errore sotto indicato.

Aiutateci

operazione cross-thread non valida: controllo 'txtFolderActivity' si accede da un thread diverso dal thread è stato creato su.

risposta

9

È necessario utilizzare il metodo Invoke nel modulo, ad es. con un delegato anonimo per apportare le modifiche in risposta all'evento.

Il gestore eventi viene generato con un altro thread. Questo secondo thread non può accedere ai controlli nel modulo. Deve "Invocarli" per lasciare che il thread faccia tutto il lavoro di controllo che li ha inizialmente creati.

Invece di:

myForm.Control1.Text = "newText"; 

si deve scrivere:

myForm.Invoke(new Action(
delegate() 
{ 
    myForm.Control1.Text = "newText"; 
})); 
+0

1 - Ho bisogno di provare il vostro modo di risolvere questo problema, in quanto è molto più semplice di quanto il mio approccio attuale. –

+0

+1 Grazie mille @Mischa. Ha reso il mio compito molto facile. :) – IsmailS

3

Si sta cercando di aggiornare l'interfaccia utente da un thread non-UI. L'interfaccia utente ha un'affinità di thread e può essere aggiornata solo da un thread che lo ha creato. Se utilizzi WinForms, consulta l'articolo MSDN How to: make thread-safe calls to Windows Forms Controls. Fondamentalmente è necessario aggiornare l'interfaccia utente tramite il metodo Control.Invoke. Per WPF, è necessario utilizzare DispatcherObject.

1

Fondamentalmente è necessario avere almeno due thread nell'applicazione e il thread su cui è attiva la logica di controllo è diverso, quindi si ottiene questo errore, poiché i controlli non sono protetti da thread.

Questo è quello di proteggere l'utente da problemi che potrebbero essere causati da più thread cambiando lo stesso controllo, allo stesso tempo.

Si può trovare molto più in dettaglio, cercando qui: http://msdn.microsoft.com/en-us/library/ms171728%28VS.80%29.aspx

Problemi correlati