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。