C#应用程序变得缓慢且无法响应,因为多行文本框中的字符串增长

时间:2010-01-13 15:59:57

标签: c# performance timer textbox

我有一个C#应用程序,其中有大量信息被添加到文本框中以显示给用户。在处理数据时,几乎立即,应用程序变得非常缓慢且无响应。这就是我目前正在尝试处理这个问题的方法:

   var saLines = textBox1.Lines;
   var saNewLines = saLines.Skip(50);
   textBox1.Lines = saNewLines.ToArray();

此代码每100毫秒从一个计时器运行。有没有更好的方法来处理这个?我使用的是Microsoft Visual C#2008 Express Edition。感谢。

5 个答案:

答案 0 :(得分:8)

简单的答案是TextBox.AppendText()

最初你的表现要好得多。 我测试每20毫秒写一个500字符的消息,持续2分钟(使用BackgroundWorker),UI保持响应,CPU最小化。当然,在某些时候,它会变得没有反应,但它足以满足我的需求。

答案 1 :(得分:0)

尝试在内存中包含内容列表,然后通过RemoveRange删除前50个元素,然后使用ToArray(); 像这样:

lst.RemoveRange(0,50);
textBox1.Lines = lst.ToArray();

它应该快得多。

答案 2 :(得分:0)

我说这里的主要问题是你使用TextBox作为文本的主要存储空间。每次调用TextBox.Lines时,字符串都会在Environment.NewLine上拆分。

尝试转身:

  • 将文字存储在new List<String>(maxLines)
  • 在您的AddLine方法中,检查文本缓冲区的长度并使用RemoveRange (0, excessCount)
  • 通过调用String.Join(Environment.NewLine, textBuffer.ToArray())
  • 更新您的显示TextBox

最后一次通话有点贵,但它应该可以阻止你的减速。为了更快地获得它,你需要使用一个静态大小的字符串数组并在你自己周围移动引用。

答案 3 :(得分:0)

修剪数组的最有效方法是创建所需大小的新数组,然后使用Array.Copy复制旧数组的所需部分。


我建议您保留一个包含所有行的List<string>。 您应该使用StringBuilder来构建包含您要查找的行的字符串,并将文本框的Text属性设置为StringBuilder的字符串。为了提高性能,请将StringBuilder的容量设置为对字符串最终sie的合理猜测。 (或list.Skip(...).Take(...).Sum(s => s.Length)

如果您担心记忆,可以通过拨打RemoveRange来修剪List<string>

只要你不立刻在文本框中放置太多,这样做应该非常快。 List<string>StringBuilder的所有操作都可以在后台线程中完成,您可以将完成的字符串传递给UI线程。

TextBox.Lines属性只是使用StringBuilder连接你给它的数组,所以没有必要使用它(并制作一个不必要的数组)。

答案 4 :(得分:0)

不是拆分文本然后重新加入,而是从第51行获取子字符串:

int i = textBox1.GetFirstCharIndexFromLine(50);
if (i > 0) textBox1.Text = textBox1.Text.Substring(i);