используйте asyn c / await с синхронными методами - PullRequest
0 голосов
/ 24 февраля 2020

Как заставить такой кусок кода работать асинхронно с синхронным System.Xml.Serialization.XmlSerializer.Deserialize методом, который заставляет меня использовать Result все время?

    ...
    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);
    }

1 Ответ

3 голосов
/ 24 февраля 2020

Метод уже async, поэтому нет смысла использовать .Result. Просто используйте await и не забудьте закрыть поток, иначе соединение с сервером останется открытым:

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;
    }
}
...