代码之家  ›  专栏  ›  技术社区  ›  robbrit

.NET文本框在更新时挂起

  •  1
  • robbrit  · 技术社区  · 14 年前

    我正在尝试使用以下代码在只读多行文本框中预加字符串:

    private void AddText(string text){
      // output is a StringBuilder object
      output.Insert(0, "\r\n");
      output.Insert(0, text);
    
      this.textBox1.Text = output.ToString();
    }
    

    问题是有时窗户会挂在那里(即使在 输出 是空的 文本 是短的)。我最终不得不终止应用程序才能使其再次运行。有人知道怎么避开这个吗?

    我尝试使用标签,但是我需要它可以滚动。

    哦,我使用.NET 2.0与另一个应用程序兼容,所以很遗憾我不能使用任何更新的功能。

    事先谢谢!

    编辑: 我已经更新了代码,如下所示:

    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);
      }
    }
    

    当invokeRequired为false时,不会出现问题-文本框更新得很好。然而,如果它是真的,它仍然挂起。

    伊迪丝2:好吧,我想出了一个办法。我必须在构造函数中显示()窗口,在我刚刚调用show()之前,当第一条消息出现时。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Hans Passant    14 年前

    线程问题的典型标志。此代码中需要的test textbox 1.invokeRequired。并删除任何要Control.CheckForIllegalCrossThreadCalls的分配。

        2
  •  0
  •   netadictos    14 年前

    我是这个表格的更新文本和工作为我好

    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();
            }