Comment faire en sorte qu'un tel morceau de code s'exécute de manière asynchrone avec la méthode synchrone System.Xml.Serialization.XmlSerializer.Deserialize qui m'oblige à utiliser Result tout le 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);
    }
-1
mk_yo 24 févr. 2020 à 19:39

1 réponse

Meilleure réponse

La méthode est déjà async, il n'y a donc aucune raison d'utiliser .Result. Utilisez simplement await et n'oubliez pas de fermer le flux, sinon la connexion au serveur reste ouverte :

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;
    }
}
3
mk_yo 24 févr. 2020 à 17:50