大きな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 rawファイルでは、同期バージョンは数秒で完了します。非同期バージョン(32ビットのコンテキストで実行されている)は、代わりOutOfMemoryException
をスロー:
at System.Text.StringBuilder.ToString()
at System.IO.StreamReader.<ReadToEndAsyncInternal>d__62.MoveNext()
私はこのためXDocument
によって解析のためにメモリに生のXMLを保持するために使用される一時的な文字列変数である想像します。おそらく同期シナリオでは、XDocument.Load()
はソースファイルをストリームすることができ、ファイル全体を保持する単一の巨大なStringを作成する必要はありません。
両方の世界を最大限に活用する方法はありますか? XDocument
を完全非同期I/Oでロードし、大きな一時ストリングを作成する必要はありませんか?
おそらく、あなたは 'XDocument.Load(ストリーム)'使うべきでしょうか? – DavidG
これはどのようにロード操作を非同期にしますか? – Hydrargyrum
それ自体はそうではありませんが、あなたがここに持っている文字列変数とうまくいけばOOM例外を排除します。 – DavidG