2009-08-30 5 views
6

J'écris une application windows de fichierwatcher qui recherchera les changements dans un dossier spécifié, puis enregistrera les détails dans un fichier txt.Opération croisée pas valide: Contrôle accédé à partir d'un thread autre que le thread sur lequel il a été créé

J'ai suivi exactement ce qui est mentionné dans cet article ci-dessous http://www.codeproject.com/KB/dotnet/folderwatcher.aspx

Quand je frappe la touche F5 de mon application, puis créer ou modifier un fichier dans le dossier qui est regardé jette l'erreur mentionnée ci-dessous.

S'il vous plaît aider

opération de la Croix-fil non valide: contrôle « txtFolderActivity » accessible à partir d'un autre thread que le thread il a été créé.

Répondre

9

Vous devez utiliser la méthode Invoke sur le formulaire, par ex. avec un délégué anonyme pour faire vos changements en réaction à l'événement.

Le gestionnaire d'événements est déclenché avec un autre thread. Ce 2ème thread ne peut pas accéder aux contrôles dans votre formulaire. Il doit les "invoquer" pour laisser le thread faire tout le travail de contrôle qui les a créés initialement.

Au lieu de:

myForm.Control1.Text = "newText"; 

vous devez écrire:

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

+1 - Je dois essayer votre chemin pour résoudre ce problème, car il est beaucoup plus simple que mon approche actuelle. –

+0

+1 Merci beaucoup @Mischa. Cela a rendu ma tâche très facile. :) – IsmailS

3

Vous essayez de mettre à jour l'interface utilisateur à partir d'un fil non-UI. L'interface utilisateur possède une affinité de thread et ne peut être mise à jour qu'à partir d'un thread qui l'a créée. Si vous utilisez WinForms, consultez l'article MSDN How to: make thread-safe calls to Windows Forms Controls. Fondamentalement, vous devrez mettre à jour l'interface utilisateur via la méthode Control.Invoke. Pour WPF, vous devez utiliser DispatcherObject.

1

Fondamentalement, vous devez avoir deux threads dans votre application, au moins, et le thread de votre logique de contrôle est différent, donc vous obtenez cette erreur, car les contrôles ne sont pas threadsafe.

Ceci permet de vous protéger des problèmes pouvant résulter de plusieurs threads changeant le même contrôle en même temps.

Vous pouvez trouver beaucoup plus de détails en regardant ici: http://msdn.microsoft.com/en-us/library/ms171728%28VS.80%29.aspx

Questions connexes