-1

How to make such piece of code run asynchronously with synchronous System.Xml.Serialization.XmlSerializer.Deserialize method which forces me to use Result all the way long?

    ...
    await GetContent(url) 
    ...

    private async Task<Node> GetContent (string url)
   {
        var response = _httpClient.GetAsync(url).Result;
        var ser = new XmlSerializer(typeof(Node));
        retVal = (Node)ser.Deserialize(response.Content.ReadAsStreamAsync().Result);
    }
mk_yo
  • 752
  • 1
  • 12
  • 39

1 Answers1

3

The method is already async so there's no reason to use .Result. Just use await and remember to close the stream, otherwise the server connection remains open:

private async Task<Node> GetContent (string url)
{
    var response = await _httpClient.GetAsync(url);

    //**IMPORTANT** Ensure the stream is closed
    using(var stream= await response.Content.ReadAsStreamAsync())
    {
       var ser = new XmlSerializer(typeof(Node));
       var retVal = (Node)ser.Deserialize(stream);
       return retVal;
    }
}
mk_yo
  • 752
  • 1
  • 12
  • 39
Panagiotis Kanavos
  • 120,703
  • 13
  • 188
  • 236