异步保存XElement

时间:2018-01-19 21:55:59

标签: c# asynchronous async-await xelement xmlwriter

我目前正在使用XElement同步地将XML树(XmlWriter)写入文件,特别是通过根元素上的XElement.WriteTo(XmlWriter)。我试图使其异步(等待)。 XmlWriter可以异步(XmlWriterSettings.Async = true),并且具有许多方法的异步版本。但是,它没有方法来编写XElement(异步与否),并且没有XElement.WriteTo(XmlWriter)的异步版本。

可以使用什么API将XElement异步写入文件?

1 个答案:

答案 0 :(得分: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 fiddle