异步加载XDocument

Hyd*_*rum 8 c# asynchronous linq-to-xml async-await

我想将大型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);
    }
Run Code Online (Sandbox Code Playgroud)

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

   at System.Text.StringBuilder.ToString()
   at System.IO.StreamReader.<ReadToEndAsyncInternal>d__62.MoveNext()
Run Code Online (Sandbox Code Playgroud)

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

有没有办法让两全其美?加载XDocument完全异步的I/O,而不需要创建一个大的临时字符串?