我想将大型 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
,而不需要创建大型临时字符串?
最佳答案
XDocument.LoadAsync()
在 .NET Core 2.0 中可用:https://learn.microsoft.com/en-us/dotnet/api/system.xml.linq.xdocument.loadasync?view=netcore-2.0
关于c# - 异步加载 XDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43590338/