如何在C#的TextBox中显示char数组?

时间:2014-02-13 14:03:07

标签: c# string winforms performance textbox

更新:似乎没有垃圾回收。但是我仍然想知道是否或如何通过显示固定大小的char数组而不是很长的字符串来减少内存使用,其中onyl对我来说很有趣。

<小时/> 为了减轻我的应用程序的垃圾收集(为了更好的性能),我想在多行TextBox或其他控件中显示一个char数组而不是字符串。所以我可以修改char数组并让控件显示它。我不关心第一行,它们可以被切断。

这是一种快速日志查看器

TextBox textBox = new TextBox();
// ...

// on every new line:
textBox.AppendText(Environment.NewLine + line);

现在我经常通过textBox.AppendText(Environment.NewLine + line);将字符串行追加到文本框中。我(相信)注意垃圾收集每隔几秒钟就会给我一次,延迟时间接近1秒,因为我的应用程序没有其他原因经常滞后(我的大部分数据都是有组织的,以避免创建新对象)。

修改

  • 我需要避免创建没有new string(...)的对象,所以我只能使用这个1字符数组。
  • 字符串是不可变的,所以我无法编辑那些(char数组或StringBuilder似乎是出路)
  • 当我让它运行几小时甚至几天时,我也希望减少内存使用。

2 个答案:

答案 0 :(得分:5)

这不起作用...... TextBox在内部存储其文本。当您设置Text或致电AppendText()等时,控件会将您提供的数据复制到其内部字符串中。没有办法在一个字符数组中“指出它”,您可以更新它并让它看到您的更改。

要实现这一点,您需要编写自己的控件,根据数组绘制文本。 (这实际上是大多数显示大量文本的程序,例如文本编辑器。)

但是,您确定您完全了解导致性能问题的原因是什么?你可能是对的,但是分配太多string对象造成的垃圾收集不是我的第一个嫌疑。您是否在性能/内存分析器中运行代码并对此进行了彻底调查,或者您只是在猜测?

答案 1 :(得分:1)

TextBox在内部使用可变文本模型,因此追加文本不应导致世界各地的垃圾收集。虽然您可能为每一行生成新的string实例,但它们应该是非常短暂的,因此不应(通常)从短暂的一代中提升。收集短暂的一代很便宜,也不会引起反应问题。

因此,我怀疑您每次更新时都会无意中导致TextBox从其整个内容中创建新的string。如果您在更新代码中的任何位置访问其Text属性,就会发生这种情况,从上面的评论中可能会出现这种情况。

也许您正在访问Text.Length以便滚动到结尾,或者沿着这些行?如果是,请在调用TextBox.ScrollToEnd()后立即调用TextBox.ScrollToCaret()(WPF)或AppendText()(Windows窗体)。