【发布时间】: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),但如果我猜这是线程问题,您还有其他问题。请发布其余代码