【问题标题】:use async /await with synchronous methods将 async /await 与同步方法一起使用
【发布时间】:2020-02-24 16:39:58
【问题描述】:

如何使用同步的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);
    }

【问题讨论】:

  • 这里需要更多信息,是包含方法async吗?
  • 问题是父方法,而不是Deserialize。至少设为async Task 并使用await 读取值。 不要将电话放在同一行。即使是同步代码,它也会让调试变得一团糟。
  • 你应该使用using var stream= await response.Content.ReadAsStreamAsync(); retVal=(Node)ser.Deserialize(content);
  • 这能回答你的问题吗? How to use HttpClient without async
  • 顺便说一句,流 必须 被释放,否则与服务器的连接保持打开状态。当前代码正在泄漏连接

标签: c# asynchronous serialization .net-core async-await


【解决方案1】:

方法已经是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;
    }
}

【讨论】:

  • http 调用后有结果。怎么处理?
  • 这个结果可能是错误留下的
猜你喜欢
  • 2014-09-28
  • 1970-01-01
  • 2017-11-05
  • 2019-04-15
  • 2014-06-19
  • 2018-01-14
  • 2018-09-12
  • 1970-01-01
相关资源
最近更新 更多