我有一个可爱的任务,就是弄清楚如何处理加载到我们应用程序的脚本编辑器中的大文件(这就像我们内部产品的快速宏的VBA)。大多数文件大约为 300-400 KB,可以很好地加载。但是当它们超过 100 MB 时,这个过程就很难了(正如你所期望的那样)。
发生的情况是文件被读取并推送到 RichTextBox 中,然后导航 - 不要太担心这部分。
编写初始代码的开发人员只是使用 StreamReader 并做
[Reader].ReadToEnd()
这可能需要很长时间才能完成。
我的任务是分解这段代码,将其分块读入缓冲区并显示一个进度条,并带有取消它的选项。
一些假设:
- 大多数文件为 30-40 MB
- 该文件的内容是文本(不是二进制),有些是 Unix 格式,有些是 DOS。
- 一旦检索到内容,我们就会计算出使用了什么终结符。
- 加载后,没有人会担心在富文本框中呈现所需的时间。这只是文本的初始加载。
现在的问题:
- 我可以简单地使用 StreamReader,然后检查 Length 属性(因此 ProgressMax)并发出读取设置的缓冲区大小并在后台工作人员内部的 while 循环中迭代,这样它就不会阻塞主 UI 线程?然后在完成后将 stringbuilder 返回到主线程。
- 内容将转到 StringBuilder。如果长度可用,我可以用流的大小初始化 StringBuilder 吗?
这些(在您的专业意见中)是好主意吗?过去我在从 Streams 读取内容时遇到了一些问题,因为它总是会丢失最后几个字节或其他内容,但如果是这种情况,我会问另一个问题。