2017-05-06 1 views
0

J'ai besoin de deux méthodes à exécuter en parallèle. Work() modifie les données à l'intérieur d'une boucle infinie. Represent place également les données modifiées dans le TextBox à l'intérieur de la boucle infinie.Opération invalide dans plusieurs threads

Log log = Log.GetInstance; //singleton 
private void Work() 
     { 
      while (true) { //changing log } 
     } 

private async void Represent() 
     { 
      await Task.Run(() => 
      { 
       while (true)  
       { 
        String str = String.Empty; 
        //generating str from log 
        textBox.Text = str; 
       } 
      }); 
     } 

private async void button_Click(object sender, EventArgs e) 
     { 
      await Task.Run(() => Work()); 
     } 
public MainForm() 
     { 
      Represent(); 
     } 

Le problème est que textBox.Text = str; génère une erreur "invalid operation in multiple threads: attempt to access the control "textBox" from a thread in which it was created". Comment résoudre ce problème? Merci d'avance. P.S. La méthode suggérée here pour .NET 4.5 ne fonctionne pas à cause de la boucle infinie.

+0

Espérons que ce message d'erreur n'est pas littéralement ce qu'il dit – harold

Répondre

-1

pour le filetage de vous changer besoin d'invoquer

utiliser ce code:

utiliser ce juste pour les éléments sont ui comme textbox, combobox, ..... pour les éléments publics vous n'avez pas besoin de ce

this.Invoke(new Action(() => { /*your code*/ })); 

pour votre samp le:

Log log = Log.GetInstance; //singleton 
private void Work() 
     { 
      while (true) { //changing log } 
     } 

private async void Represent() 
     { 
      await Task.Run(() => 
      { 
       while (true)  
       { 
        String str = String.Empty; 
        //generating str from log 
        this.Invoke(new Action(() => { textBox.Text = str;})); 
       } 
      }); 
     } 

private async void button_Click(object sender, EventArgs e) 
     { 
      await Task.Run(() => Work()); 
     } 
public MainForm() 
     { 
      Represent(); 
     } 
-1

La tentative d'accès au membre de System.Windows.Forms.Control à partir d'un thread différent du thread de l'interface utilisateur provoque une exception de thread croisé.

Jetez un oeil à la suivante: How to update the GUI from another thread in C#?