public async Task <ProductRoot> ParseDocument(string file, VariantType variant) { var state = new ParseState(file, variant); using (var stream = File.OpenRead(file)) { var settings = new XmlReaderSettings { Async = true }; using (var reader = XmlReader.Create(stream, settings)) { while (await reader.ReadAsync().ConfigureAwait(false)) { switch (reader.NodeType) { case XmlNodeType.Element: state.Inc(reader.Name, XmlNodeType.Element); await _nodeParser.Read(state, reader).ConfigureAwait(false); break; case XmlNodeType.Text: state.SetNodeType(XmlNodeType.Text); await _nodeParser.Read(state, reader).ConfigureAwait(false); break; case XmlNodeType.EndElement: state.SetNodeType(XmlNodeType.EndElement); state.SetName(reader.Name); await _nodeParser.Read(state, reader).ConfigureAwait(false); state.Dec(); break; } } } } var productRoot = new HPEStateConverter().CreateProductRoot(file, state, variant); return(productRoot); }