Ich möchte große XML-Dokumente in XDocument-Objekte laden. Der einfache synchrone Ansatz mit XDocument.Load(path, loadOptions)
funktioniert super, blockt aber beim Laden großer Dateien (besonders aus dem Netzwerkspeicher) für eine ungemütlich lange Zeit im GUI-Kontext.XDocument asynchron laden
Ich schrieb diese Async-Version mit der Absicht, die Reaktionszeit beim Laden von Dokumenten zu verbessern, insbesondere beim Laden von Dateien über das Netzwerk.
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);
}
jedoch auf einem 200 MB XML RAW-Datei von der lokalen Festplatte geladen wird, vervollständigt die synchrone Version in wenigen Sekunden. Die asynchrone Version (läuft in einem 32-Bit-Kontext) statt wirft ein OutOfMemoryException
:
at System.Text.StringBuilder.ToString()
at System.IO.StreamReader.<ReadToEndAsyncInternal>d__62.MoveNext()
Ich stelle mir dies wegen der temporären String-Variable verwendet, um die XML-Rohdaten im Speicher zu halten durch die XDocument
zum Parsen. Vermutlich ist es im synchronen Szenario möglich, XDocument.Load()
durch die Quelldatei zu streamen, und es muss nie ein einziger großer String erstellt werden, der die gesamte Datei enthält.
Gibt es eine Möglichkeit, das Beste aus beiden Welten zu bekommen? Laden Sie die XDocument
mit vollständig asynchroner E/A, und ohne eine große temporäre Zeichenfolge erstellen zu müssen?
Vielleicht sollten Sie 'XDocument.Load (Strom)'? – DavidG
Wie würde das die Ladeoperation asynchron machen? – Hydrargyrum
Nun, das wäre nicht selbst, aber es würde die String-Variable, die Sie hier haben, und hoffentlich die OOM-Ausnahme beseitigen. – DavidG