我有一个C#应用程序,其中有大量信息被添加到文本框中以显示给用户。在处理数据时,几乎立即,应用程序变得非常缓慢且无响应。这就是我目前正在尝试处理这个问题的方法:
var saLines = textBox1.Lines;
var saNewLines = saLines.Skip(50);
textBox1.Lines = saNewLines.ToArray();
此代码每100毫秒从一个计时器运行。有没有更好的方法来处理这个?我使用的是Microsoft Visual C#2008 Express Edition。感谢。
答案 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)
RemoveRange
(0, excessCount)
String.Join(Environment.NewLine, textBuffer.ToArray())
最后一次通话有点贵,但它应该可以阻止你的减速。为了更快地获得它,你需要使用一个静态大小的字符串数组并在你自己周围移动引用。
答案 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);