Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET文本框在更新时挂起_C#_.net - Fatal编程技术网

C# .NET文本框在更新时挂起

C# .NET文本框在更新时挂起,c#,.net,C#,.net,我正在尝试使用以下代码将字符串预先添加到只读多行文本框中: private void AddText(string text){ // output is a StringBuilder object output.Insert(0, "\r\n"); output.Insert(0, text); this.textBox1.Text = output.ToString(); } 问题是,有时窗口会挂在那里(即使输出为空,文本很短)。我最终不得不终止应用程序以使其再次运行。

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

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

  this.textBox1.Text = output.ToString();
}
问题是,有时窗口会挂在那里(即使输出为空,文本很短)。我最终不得不终止应用程序以使其再次运行。有人知道怎么避开这件事吗

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

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

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

我使用此表单来更新文本并为我工作

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();
        }
private void AddMessageToTextBox(字符串行)
{
列表行=新列表();
行。添加(行);
lines.AddRange(txtreult.lines);
txtResult.Lines=Lines.ToArray();
这个.txtresh.Refresh();
}

您是否进行过调试,是否挂在作业线上?如果您闯入调试器,调试器是否会显示任何反汇编或任何可能为您提供线索的内容?您应该使用而不是普通的
\r\n
,但这不是问题的原因。请发布
AddText()
的完整实现,如果
output
是实例成员,请发布其类的完整实现。什么是调用AddText?我怀疑此方法是您的问题。问题在于如何调用您的方法。您没有将控制权交还给UI,或者它返回时会创建一个无限循环。您的代码没有问题(尽管您应该使用正确的换行语法environment.newline),如果我猜这是线程问题的话,您还有其他问题。请发布代码的其余部分是的,这似乎是一个线程问题,谢谢!我放了一把锁,现在一切似乎都很好。嗯,锁不能解决这种问题,它们只是把它推迟了。InvokerRequired是真的吗?啊,你是对的,它并不总是有效的。我对它进行了测试,当控件写入时,invokererequired为false。