【问题标题】:Writing huge amounts of text to a textbox将大量文本写入文本框
【发布时间】:2010-08-06 20:35:33
【问题描述】:

我正在将大量格式化文本的日志写入 .net windows 窗体应用程序中的文本框。

一旦数据超过几兆,它就会变慢。由于我要附加字符串,因此每次都必须重新分配对吗?我只需要将值设置为文本框一次,但在我的代码中我正在执行line+=data 数万次。

有没有更快的方法来做到这一点?也许不同的控制?有没有可以使用的链表字符串类型?

【问题讨论】:

  • 你为什么不使用 StringBuilder 同时你正在连接,一旦你完成设置它的 ToString 到 TextBox.Text?
  • @Alfred:看起来对你的建议稍作改动是最有效的。不同之处在于 StringBuilder 将用于累积文本,然后使用 AppendText() 将文本附加到 TextBox,之后 StringBuilder 被清除。

标签: c# winforms textbox


【解决方案1】:

如果文本框以增量方式添加,StringBuilder 将无济于事,例如日志输出。

但是,如果上述情况属实,并且如果您的更新足够频繁,则您可能应该缓存一些更新,然后一步添加它们(而不是不断地添加)。这将为您节省许多字符串重新分配......然后 StringBuilder 会很有帮助。

注意事项:

  1. 创建一个类范围的 StringBuilder 成员 (_sb)
  2. 启动计时器(或使用计数器)
  3. 将文本更新附加到 _sb
  4. 当计时器计时或某些计数器达到重置并附加到 文本框
  5. 从 #1 重启进程

【讨论】:

  • 虽然您的回答肯定是相关的,但我认为语句 我只需要将值设置为文本框一次,但在我的代码中我正在执行 line+=data 数万次. 表示这不会是他具体问题的答案。
  • @Marc:其实保罗的回答很好。一个线程锁定SB,附加到它,解锁。它这样做了很多很多次。 UI 线程可以每秒轮询一些少量次数,锁定 SB,获取 ToString 并清除它。这样,UI 更新频率就完全独立于串联频率。
【解决方案2】:

目前还没有人提到虚拟化,这确实是为海量数据提供可预测性能的唯一方法。即使使用StringBuilder 并每半秒将其转换为字符串,一旦日志变得足够大,也会非常缓慢。

通过数据虚拟化,您只需将必要的数据保存在内存中(即用户可以看到的内容,可能在任一侧还多一点),而其余的将存储在磁盘上。旧数据会随着新数据的出现而“滚出”内存。

为了使TextBox 出现 就好像它有很多数据一样,你会告诉它它有。当用户滚动时,您将使用来自底层源的相关数据替换缓冲区中的数据(使用随机文件访问)。所以你的 UI 会监控一个文件,而不是监听日志事件。

当然,这比简单地使用 StringBuilder 要多得多,但我认为值得一提以防万一。

【讨论】:

  • 如果你仔细看看 Paul Sasik 的回答,包括我的 cmets,我想你会发现它不会因为大字符串而减速。这是因为我们在写入 TextBox 时仍然使用 AppendText 并不断清除 StringBuilder。
  • @Steven:但TextBox 仍然拥有所有数据,因此您的数据量仍然受到限制。虚拟化消除了这一点,因为它只查看整个数据集的一个小窗口。您只受到磁盘空间的限制。
  • 任何成本/收益分析都必须包括成本。虚拟化文本框的用处要小得多,因为您甚至不能做简单的事情,例如 Ctrl+A、Ctrl+C。虚拟化适用于附加到数据库表的网格等情况。
  • @Steven:我只是指出它是一种选择。如果你要实现数据虚拟化,那是因为你有大量的数据。您不希望 Ctrl+A 在这种情况下工作,因为用户可能会在脚上开枪。即使您确实希望它工作(例如,如果数据少于 10MB),您仍然可以通过虚拟化选择。或者,如果用户将大量文本(从文件中)复制到剪贴板,您可以警告用户。
  • 公平地说,数据虚拟化将是如何处理无限量数据的正确通用答案。我会投赞成票,以便引起注意。
【解决方案3】:

StringBuilder 一起构建您的字符串,然后使用toString() 将其转换为字符串,并将其分配给文本框。

【讨论】:

  • 也许 StringBuffer 是一个我从未听说过的类,但我敢打赌,你的意思可能是 StringBuilder
  • 语言错误,StringBuffer 是 java。 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多