2013-02-24 41 views
1

我做了一个应用程序(类似谷歌地图),我添加了一个文本框字段,其中写入了调试数据(当然,我的意思是之后删除它)。有趣的是,在“完全”之后,我们说几千字节 - 整个程序显着减速并需要退出,因为无法使用它。为什么文本框溢出如此显着地减慢程序?

你能解释一下吗?

+0

您是否在每次更新时追加预先存在的'textbox.text'(即读取它,连接字符串并将其写回),或者每次将文本替换为单独存储到文本框的调试信息?我得到的是,它可能是您对文本框的读取/写入速度每次都会变慢,而不是“完全”放慢您的应用程序的事实。 – Sepster 2013-02-24 13:09:14

+0

我总是附加少量数据 - 这将解释很多 – Novellizator 2013-02-24 13:17:38

回答

1

嗯,它肯定比几千字节。但是,是的,TextBox非常不适合作为显示追踪信息的控件。每次添加新行时,都必须重新分配其内部缓冲区,将旧文本与新文本合并。这是.NET的String类的相同类型的问题。使用StringBuilder类作为解决方法,但TextBox不存在等效项。

当您添加很多行时,使TextBox非常慢的另一个选项是WordWrap属性。将其设置为True需要它在每次绘制每行时确定每行的长度,并进行大量工作。

因此,解决方法是将WordWrap设置为False,并在长度达到限制时通过将一半的文本丢弃来防止文本的数量无限增长。或者通过使用不同的控件,TextBox不太适合,因为编辑跟踪数据没有意义。像ListBox一样。

0

不是一次追加一点点数据,例如:

debugTextBox.Text += "Some new debug info" 

也许这项战略可能更快:

StringBuilder debugText = new StringBuilder(); 
... 
debugText.Append("Some new debug info"); 
debugTextBox.Text = debugText.ToString(); 

(虽然StringBuilder可能是矫枉过正了这一点,并可能证明比直接使用字符串串联工作要慢得多)