Mettre à jour l’étiquette à partir d’un autre thread

J’utilise un fil écrit dans une autre classe pour mettre à jour une étiquette. L’étiquette est le contenu de la classe Winform Main.

Scanner scanner = new Scanner(ref lblCont); scanner.ListaFile = this.listFiles; Thread trd = new Thread(new ThreadStart(scanner.automaticScanner)); trd.IsBackground = true; trd.Start(); while (!trd.IsAlive) ; trd.Join(); 

Comme vous pouvez le voir, je passe la référence de label au constructeur de la deuxième classe. Dans la deuxième classe (Scanner), j’ai une méthode appelée “automaticScanner” qui devrait mettre à jour l’étiquette avec ce code:

 public Scanner(ref ToolSsortingpStatusLabel _lblContatore) { lblCounter= _lblContatore; } Thread threadUpdateCounter = new Thread(new ThreadStart(this.UpdateCounter)); threadUpdateCounter.IsBackground = true; threadUpdateCounter.Start(); while (!threadUpdateCounter .IsAlive) ; threadUpdateCounter.Join(); private void AggiornaContatore() { this.lblCounter.Text = this.index.ToSsortingng(); } 

J’ai reçu cette erreur lors de la mise à jour de l’étiquette:

Opération cross-thread non valide: le contrôle ‘Main’ accessible à partir d’un thread autre que celui sur lequel il a été créé

J’utilise .net 4 avec Winform C #.

Merci beaucoup pour les réponses.

News: Le problème est cette ligne:

 trd.Join(); 

Cette ligne bloque mon interface graphique et le libellé n’a pas été mis à jour. Il existe des méthodes pour contrôler la fin du fil et mettre à jour l’étiquette jusqu’à la fin? Merci

Vous ne pouvez pas mettre à jour l’interface utilisateur à partir d’un autre thread que celui de l’interface utilisateur. Utilisez-le pour mettre à jour le fil sur le fil de l’interface utilisateur.

  private void AggiornaContatore() { if(this.lblCounter.InvokeRequired) { this.lblCounter.BeginInvoke((MethodInvoker) delegate() {this.lblCounter.Text = this.index.ToSsortingng(); ;}); } else { this.lblCounter.Text = this.index.ToSsortingng(); ; } } 

Veuillez parcourir ce chapitre et d’autres extraits de ce livre pour obtenir une image claire du threading:

http://www.albahari.com/threading/part2.aspx#_Rich_Client_Applications

Utilisez MethodInvoker pour mettre à jour le texte de l’étiquette dans un autre thread.

 private void AggiornaContatore() { MethodInvoker inv = delegate { this.lblCounter.Text = this.index.ToSsortingng(); } this.Invoke(inv); } 

Vous obtenez l’erreur parce que votre thread d’interface utilisateur contient l’étiquette, et comme vous essayez de la mettre à jour via un autre thread, vous obtenez une exception multithread.

Vous pouvez également voir: Threading dans Windows Forms

Utilisez simplement la méthode Control.Invoke ou la méthode Control.BeginInvoke .

Excellent exemple: comment: effectuer des appels en mode thread-safe vers des contrôles Windows Forms .