Асинхронное сохранение XElement

В настоящее время я пишу дерево XML (XElement) в файл синхронно, используя XmlWriter, в частности, через XElement.WriteTo(XmlWriter) в корневом элементе. Я пытаюсь сделать это асинхронным (с ожиданием). XmlWriter можно сделать асинхронным (XmlWriterSettings.Async = true), и многие его методы имеют асинхронную версию. Однако у него нет методов для записи XElement (асинхронных или нет), и нет асинхронной версии XElement.WriteTo(XmlWriter).

Какой API можно использовать для асинхронной записи XElement в файл?


person Jimmy    schedule 19.01.2018    source источник
comment
Я действительно сомневаюсь, что есть польза от выполнения такой работы с привязкой к процессору в асинхронном режиме. Task.Run() — это вариант, но я думаю, что это было бы скорее вредно для производительности, чем полезно, если бы значение не было действительно огромным объемом данных.   -  person Crowcoder    schedule 20.01.2018
comment
Спасибо за комментарий; однако, если это была такая плохая идея, почему у XmlWriter так много асинхронных методов (я все еще недоумеваю, почему нет ни одного для написания XElement)?   -  person Jimmy    schedule 20.01.2018


Ответы (1)


XmlWriter имеет метод XmlWriter.WriteNodeAsync(XmlReader, Boolean), которому вы можете передать XmlReader, возвращенный XNode.CreateReader() например. вот так:

public static class XElementExtensions
{
    public static async Task WriteToAsync(this XContainer element, Stream stream, bool defAttr = true, bool indent = false)
    {
        var settings = new XmlWriterSettings
        {
            Async = true,
            CloseOutput = false,
            Indent = indent,
        };          

        using (var writer = XmlWriter.Create(stream, settings))
        using (var reader = element.CreateReader())
        {
            await writer.WriteNodeAsync(reader, defAttr);
        }
    }
}

Затем, если у вас есть Stream stream, вы можете написать ему следующее:

await element.WriteToAsync(stream, false, true);

Пример скрипта .Net.

person dbc    schedule 20.01.2018