将大量文本写入文本框

Byr*_*ock 10 c# textbox winforms

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

一旦数据超过几兆,它就会很慢.因为我追加字符串必须每次都重新分配吗?我只需要将值设置为文本框一次,但在我的代码中我做了line+=data数万次.

有更快的方法吗?也许一个不同的控制?我可以使用链接列表字符串类型吗?

Pau*_*sik 7

如果文本框以递增方式添加,StringBuilder将无法帮助,例如日志输出.

但是,如果上述情况属实,如果您的更新频繁,则可能需要缓存一些更新,然后将其追加到一个步骤(而不是不断添加).这将为您节省许多字符串重新分配...然后StringBuilder会有所帮助.

笔记:

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

  • @Marc:实际上,保罗的回答非常好.一个线程锁定SB,附加到它,解锁.它做了很多次.UI线程每秒可以轮询少量次数,锁定SB,获取ToString并清除它.这样,UI更新频率完全独立于级联频率. (2认同)

Ken*_*art 6

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

使用数据虚拟化,您只需要在内存中保存必要的数据(即用户可以看到的内容,并且可能在两侧都有更多内容),而其余数据将存储在磁盘上.当新数据进入以替换它时,旧数据将"推出"内存.

为了让它TextBox 看起来好像它里面有很多数据,你会告诉它它确实存在.当用户滚动时,您将使用来自底层源的相关数据替换缓冲区中的数据(使用随机文件访问).因此,您的UI将监视文件,而不是监听日志记录事件.

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


Fra*_*ank 5

与a一起构建String StringBuilder,然后使用它将其转换为String toString(),并将其指定给文本框.

  • 也许StringBuffer是一个我从未听说过的课程,但是我打赌它更可能是你的意思StringBuilder (2认同)