我想將大型XML文檔加載到XDocument對象中。 使用XDocument.Load(path, loadOptions)
的簡單同步方法效果很好,但是在加載大文件(特別是從網絡存儲)時在GUI上下文中阻塞了很長時間。異步加載XDocument
我寫了這個異步版本,旨在提高文檔加載的響應速度,特別是通過網絡加載文件時。
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()
能夠通過源文件進行流式傳輸,並且從不需要創建一個巨大的字符串來保存整個文件。
有沒有什麼辦法讓兩全其美?加載XDocument
完全異步I/O,而不需要創建一個大的臨時字符串?
也許你應該使用'XDocument.Load(流)'? – DavidG
這會如何使加載操作異步? – Hydrargyrum
那麼它本身不會,但它會消除你在這裏的字符串變量,並希望OOM異常。 – DavidG