我正在尝试使用以下代码在字符串前面添加一个只读的多行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()。
答案 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();
}