C#多行文本框内存使用问题

5
我在C#中使用多行文本框只记录一些跟踪信息。我简单地使用AppendText("text-goes-here\r\n")添加行。
我让程序运行了几天(有很多活跃的跟踪),发现它使用了很多内存。长话短说,即使将maxlength值设置为非常小的值(256),文本框的内容仍然会不断扩大。
我原以为它像FIFO一样(丢弃超过maxlength大小的最旧文本)。但事实并非如此,它只是不断增加大小。这显然是我浪费内存的原因。有人知道我做错了什么吗?
在初始问题几个小时后添加...... 好的,我尝试了下面建议的代码。为了快速测试它,我只是在我的应用程序中添加了一个计时器,并从该计时器滴答声中调用一个方法,该方法基本上执行与下面代码相同的操作。滴答率很高,以便我可以观察进程的内存使用情况,并快速确定是否存在泄漏。没有。这很好;但是,我将其放入我的应用程序中,内存使用情况没有改变(仍然泄漏)。这确实意味着我在其他地方有泄漏 :-( 但是,如果我在该方法的顶部添加一个返回,使用情况就会恢复稳定。对此有何看法?计时器滴答声调用的代码没有累积内存,但我的真实代码(相同的方法)却有。不同之处在于我从真实代码的各种不同位置调用该方法。调用的上下文是否会以某种方式影响这一点?(请注意,如果还不明显,我绝不是.NET专家)...

你为什么要使用文本框而不是将其记录到数据库或写入事件日志呢? - Thyamine
这是ASP.NET中的一个常见问题,因为多行文本框在客户端呈现为TEXTAREA HTML控件,它会忽略像maxlength这样的属性。不过我猜这是WinForms吧? - MusiGenesis
Thyamine.. 原因很简单。我只想能够查看程序的一些运行时跟踪;而且我希望 AppendText() 的行为类似于 FIFO。 - Ed.
MusiGenesis... 是的,这是一个Windows应用程序(.NET C#)。 - Ed.
2个回答

2

TextBox将允许您添加文本,而不管MaxLength值如何 - 它仅用于控制用户输入。您可以创建一个方法,在验证未达到最大长度的情况下添加新文本,如果已达到最大长度,则从开头删除x行。


我刚刚测试了一下。无论maxLength属性如何,TextBox中的基础字符串属性都会返回完整的字符串。 - Eugenio De Hoyos
这让我感到惊讶。我在想肯定有一种方法可以将AppendText设置为FIFO模式,使用maxlength作为大小。 - Ed.
@Ed - 当然有方法 - 就是我建议的那个,@Varun Chatterji 在他的回答中实现了 :) 但没有内置的方法来做到这一点。 - Andrey
1
@Ed:这并不算什么惊人的事情。TextBox并非设计用来处理无限量文本输入的。我认为你最好编写一个自定义UserControl,该控件继承于TextBox并能够完全按照你的需求运行。 - MusiGenesis

2
您可以使用一个简单的函数来添加文本:
int maxLength = 256;
private void AppendText(string text)
{
     textBox1.AppendText(text);
     if(textBox1.Text.Length > maxLength)
       textBox1.Text = textBox1.Text.Substring(textBox1.Text.Length - maxLength);
}

这个方法可以用,但是看起来需要做很多工作,特别是当我需要让文本框在达到最大长度时滚动到底部。谢谢!但我希望有更好的方法。 - Ed.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接