异步保存 XElement

Saving XElement asynchronously

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

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

XmlWriter 有一个方法 XmlWriter.WriteNodeAsync(XmlReader, Boolean) to which you can pass the XmlReader returned by 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.