2010-10-22 8 views
1

Je suis en train de préfixer une chaîne en lecture seule, TextBox multi-ligne en utilisant le code suivant:TextBox .NET se bloque lors de la mise à jour

private void AddText(string text){ 
    // output is a StringBuilder object 
    output.Insert(0, "\r\n"); 
    output.Insert(0, text); 

    this.textBox1.Text = output.ToString(); 
} 

Le problème est que parfois la fenêtre se termine juste accroché là (même lorsque la sortie est vide, et le texte est court). Je finis par avoir à tuer l'application pour la faire fonctionner à nouveau. Est-ce que quelqu'un sait comment contourner cela?

J'ai essayé d'utiliser un label à la place, mais j'ai besoin qu'il soit scrollable.

Oh, et j'utilise .NET 2.0 pour la compatibilité avec une autre application, donc je ne peux malheureusement pas utiliser de nouvelles fonctionnalités.

Merci d'avance!

EDIT: Je ai mis à jour le code pour ressembler à ceci:

private delegate void Outputter(string text); 

private void Output(string text){ 
    lock (messageLock){ 
    string text = text.ToString(); 
    // output is a StringBuilder instance variable 
    output.Insert(0, Environment.NewLine); 
    output.Insert(0, text); 

    this.textBox1.Text = output.ToString(); 
    } 
} 

private void AddText(string text){ 
    if (this.textBox1.InvokeRequired){ 
    this.textBox1.Invoke(new Outputter(this.Output), new object[] {text}); 
    }else{ 
    Output(text); 
    } 
} 

Lorsque InvokeRequired est faux, il n'y a pas de problème - la zone de texte est mis à jour très bien. Quand c'est vrai, cependant, ça reste bloqué.

EDIT2: Très bien, j'ai trouvé une solution. Je dois Show() la fenêtre dans le constructeur, où avant j'appelais juste Show() quand le premier message est entré.

+0

Avez-vous fait le débogage, est-il suspendu à la ligne d'affectation? Si vous vous cassez avec le débogueur, cela vous montre-t-il un démontage ou quoi que ce soit qui pourrait vous donner une idée d'où ou de quoi il s'agit? – CodingGorilla

+0

Vous devriez utiliser [Environment.NewLine] (http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx) au lieu de "\ r \ n", mais ce n'est pas la cause de ton problème. Veuillez publier l'implémentation complète de 'AddText()', ou de sa classe si 'output' est un membre d'instance. –

+0

Qu'appelle AddText? – Geoff

Répondre

3

Signe classique d'un problème de threading. Testez textBox1.InvokeRequired dans ce code. Et supprimez toute assignation à Control.CheckForIllegalCrossThreadCalls que vous pourriez avoir.

+0

Oui, il semble être un problème de filetage, merci! Je mets une serrure et tout semble bien pour le moment. – robbrit

+0

Hmm, les verrous ne règlent pas ce genre de problème, ils le retardent juste. Est-ce que InvokeRequired est vrai? –

+0

Ah, vous avez raison, ça ne marche pas toujours. Je l'ai testé dehors et InvokeRequired est faux quand le contrôle est écrit. – robbrit

0

Je suis ce formulaire pour mettre à jour le texte et fin de travail pour moi

private void AddMessageToTextBox(string line) 
     { 
      List<string> lines = new List<string>(); 

      lines.Add(line); 
      lines.AddRange(txtResult.Lines); 
      txtResult.Lines = lines.ToArray(); 
      this.txtResult.Refresh(); 
     } 
Questions connexes