winforms 将大量文本写入文本框

kd3sttzy  于 2022-12-14  发布在  其他
关注(0)|答案(4)|浏览(173)

我正在一个.net windows窗体应用程序的文本框中写一个日志,里面有很多很多格式化的文本。
一旦数据超过几兆,它就很慢。因为我每次都要追加字符串,所以每次都要重新分配,对吗?我只需要将值设置到文本框一次,但在我的代码中,我做了成千上万次line+=data
有没有更快的方法?也许是不同的控件?有没有我可以使用的链接列表字符串类型?

hiz5n14c

hiz5n14c1#

如果文本框是增量添加的,例如日志输出,StringBuilder将不会提供帮助。
但是,如果以上是真的,并且如果你的更新足够频繁,那么你可能应该缓存一些更新,然后一步就把它们附加上去(而不是不断地附加)。这将保存你很多字符串重新分配......然后StringBuilder会很有帮助。
备注:
1.建立类别范围的StringBuilder成员(_sb)
1.启动计时器(或使用计数器)
1.将文本更新附加到_sb
1.当计时器滴答作响或达到某个计数器时,重置并附加到文本框
1.从#1重新启动过程

vmjh9lq9

vmjh9lq92#

还没有人提到虚拟化,这是为海量数据提供可预测性能的唯一方法。一旦日志变得足够大,即使使用StringBuilder并每半秒将其转换为字符串也会 * 非常 * 慢。
通过数据虚拟化,您只需要在内存中保存必要的数据(即用户可以看到的数据,或者两边都多一点),而其余的数据则存储在磁盘上。旧数据会“滚出”内存,因为新数据会替换它。
为了让TextBox * 看起来 * 好像有很多数据,你应该告诉它它有。当用户滚动时,你会用来自底层源的相关数据替换缓冲区中的数据(使用随机文件访问)。这样你的UI将监视一个文件,而不是监听日志事件。
当然,这比简单地使用StringBuilder要多得多,但我认为为了以防万一,值得一提。

hiz5n14c

hiz5n14c3#

使用StringBuilder构建String,然后使用toString()将其转换为String,并将其分配给文本框。

imzjd6km

imzjd6km4#

我发现将文本框的WordWrap属性设置为false * 可以大大 * 提高性能,只要您不介意向右滚动以查看所有文本。在我的例子中,我想将一个20-50 MB的文件粘贴到多行文本框中,以便对其进行一些处理。打开WordWrap时,这需要几分钟,而关闭WordWrap时只需几秒钟。

相关问题