.NET TextBox在更新时挂起

时间:2010-10-22 19:16:47

标签: c# .net

我正在尝试使用以下代码在字符串前面添加一个只读的多行TextBox:

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

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

问题是,有时窗口最终会挂在那里(即使输出为空,文本很短)。我最终不得不杀死应用程序以使其再次运行。有人知道怎么解决这个问题吗?

我尝试使用Label,但我需要它可以滚动。

哦,我正在使用.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时,没有问题 - 文本框更新得很好。然而,如果它是真的,它仍然会挂起。

EDIT2:好的,我想出了一个解决办法。我必须在构造函数中显示窗口,然后在第一条消息进入时我才调用Show()。

2 个答案:

答案 0 :(得分:3)

线程问题的经典标志。在此代码中测试textBox1.InvokeRequired。并删除您可能拥有的Control.CheckForIllegalCrossThreadCalls的任何分配。

答案 1 :(得分:0)

我是这个表格来更新文本并为我工作

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