你的问题不是同步与异步,而是你正在读取整个文件并且storing您之前内存中的文件部分做一点事与该数据。
如果您正在读取每一行,处理它并将结果写入另一个文件/数据库,那么StreamReader
可以让您处理多 GB(或 TB)文件。
唯一的问题是,如果您在读完文件之前存储文件的一部分,那么您可能会遇到内存问题(但您会惊讶地发现可以让文件有多大)Lists
& Dictionaries
在内存耗尽之前获取)
您需要做的是尽快保存处理后的数据,而不是将其保留在内存中(或尽可能少地保留在内存中)。
对于很大的文件,您可能需要将工作集(您的处理数据)保存在数据库中 - 可能像 SqlExpress 或 SqlLite 之类的东西可以做到(但同样,这取决于您的工作集有多大)。
希望这对您有所帮助,请随时在评论中提出进一步的问题,或编辑您的原始问题,如果我能以任何方式提供帮助,我将更新此答案。
更新 - 分页/分块
您需要以一页为单位读取文本文件,并允许用户滚动浏览文件中的“页面”。当用户滚动时,您会阅读并向他们展示下一页。
现在,您可以做一些事情来帮助自己,始终在内存中保留大约 10 页,这使得您的应用程序能够在用户快速向上/向下翻页时做出响应。在应用程序空闲时间(应用程序空闲事件)中,您可以阅读接下来的几页,再次丢弃当前页面之前或之后超过五页的页面。
向后分页是一个问题,因为您不知道文件中每一行的开始或结束位置,因此您也不知道每页的开始或结束位置。因此,对于向后分页,当您向下阅读文件时,请保留每页开头的偏移量列表(Stream.Pos
),那么你可以很快Seek
到给定位置并从那里读取页面。
如果您需要允许用户搜索文件,那么您几乎可以逐行读取文件(记住页面偏移量)查找文本,然后当您找到某些内容时,读入并呈现它们那个页面。
您可以通过将文件预处理到数据库中来加快一切速度,有网格控件可以处理动态数据集(它们将为您进行分页),并且您可以获得内置搜索/过滤器的好处。
所以,从一个certain从角度来看,这是在读取文件异步地,但这是从用户的角度来看的。但从技术角度来看,当我们谈论在编程时异步执行某些操作时,我们往往意味着其他含义。