c# - 异步加载 XDocument

标签 c# asynchronous async-await linq-to-xml

我想将大型 XML 文档加载到 XDocument 对象中。 使用 XDocument.Load(path, loadOptions) 的简单同步方法效果很好,但在加载大文件(尤其是从网络存储)时,在 GUI 上下文中会阻塞很长时间。

我编写此异步版本的目的是提高文档加载的响应速度,尤其是在通过网络加载文件时。

    public static async Task<XDocument> LoadAsync(String path, LoadOptions loadOptions = LoadOptions.PreserveWhitespace)
    {
        String xml;

        using (var stream = File.OpenText(path))
        {
            xml = await stream.ReadToEndAsync();
        }

        return XDocument.Parse(xml, loadOptions);
    }

但是,对于从本地磁盘加载的 200 MB XML 原始文件,同步版本会在几秒钟内完成。异步版本(在 32 位上下文中运行)改为抛出 OutOfMemoryException:

   at System.Text.StringBuilder.ToString()
   at System.IO.StreamReader.<ReadToEndAsyncInternal>d__62.MoveNext()

我想这是因为临时字符串变量用于将原始 XML 保存在内存中以供 XDocument 解析。据推测,在同步场景中,XDocument.Load() 能够通过源文件流式传输,并且永远不需要创建一个巨大的字符串来保存整个文件。

有什么方法可以两全其美吗?使用完全异步 I/O 加载 XDocument,而不需要创建大型临时字符串?

最佳答案

关于c# - 异步加载 XDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43590338/

相关文章:

c# - OpenXml:以编程方式获取脚注的 NumberingRestart 设置

c# - Progress<T> 没有报告功能

typescript - 手动创建 Promise 和使用 async/await API 之间有实际区别吗?

c# - C#中的命名字符串格式化

c# - 插入 Excel 工作表后调整图像大小

c# - 在 .NET Core(.NET Standard 1.4 和 .NET Framework 4.6.1)中对 System.Net.Http 使用 await/async 时出现错误?

java - Jetty 7 延续 : How to *not* redispatch the request?

c# - 来自 Asp.Net Web Api 异步/任务调用的正确堆栈跟踪

c# - 将像素数据转换为 Bitmap int array- WP8 - C#

node.js - 使用 sequelize、mocha 和 async : Sequelize doesn't call back 进行单元测试