【问题标题】:.NET TextBox hangs when updating.NET 文本框在更新时挂起
【发布时间】:2010-10-26 00:35:04
【问题描述】:

我正在尝试使用以下代码将字符串添加为只读的多行文本框:

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

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

问题是有时窗口最终只是挂在那里(即使 output 为空,并且 text 很短)。我最终不得不杀死该应用程序以使其再次运行。有人知道如何解决这个问题吗?

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

哦,我使用 .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()。

【问题讨论】:

  • 你有没有调试过,是不是挂在分配线上了?如果您闯入调试器,它是否会向您显示任何反汇编或任何可能让您知道它在哪里或在做什么的线索?
  • 您应该使用Environment.NewLine 而不是普通的\r\n,但这不是问题的原因。如果output 是实例成员,请发布AddText() 或其类的完整实现。
  • 什么叫 AddText?
  • 我怀疑这种方法是你的问题。问题在于调用您的方法的内容。您不会将控制权交还给 UI,否则会在返回时创建无限循环。
  • 您的代码没有任何问题(尽管您应该使用正确的换行符语法 environment.newline),但如果我猜这是线程问题,您还有其他问题。请发布其余代码

标签: c# .net


【解决方案1】:

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

【讨论】:

  • 是的,这似乎是线程问题,谢谢!我把锁锁上了,目前一切似乎都很好。
  • 嗯,锁不能解决这种问题,他们只是推迟它。 InvokeRequired 是真的吗?
  • 啊,你是对的,它并不总是有效。我对其进行了测试,当控件被写入时,InvokeRequired 为 false。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多