httpclient异步/等待与否

 Ycandy 发布于 2023-02-13 10:06

我正在使用一个httpclient实例发送多个请求来休息web api以获取数据.这是我的代码的样子:

首先,我有一个控制层,用于调用数据的数据层.

public class ControlLayer
{
    protected DataLayer dal;

    //constructors here

    public int getInfo1(int param)
    {
      int ret = this.dal.getInfo1(param);
      return ret;
    }

    public int getInfo2(int param)
    {
      int ret = this.dal.getInfo2(param);
      return ret;
    }
}

然后我有调用webAPI的dataLayer,它看起来像这样.这里为了简单起见,我直接使用.result.

public class DataLayer
{
    HttpClient client = new HttpClient();
    string url = "";

    public int getInfo1(int param1)
    {
      int ret=0;
      HttpResponseMessage response = client.GetAsync(url).Result;
      //.... do some work, get the value for ret

      return ret;
    }

    public int getInfo2(int param1)
    {
      int ret = 0;
      HttpResponseMessage response = client.GetAsync(url).Result;
      //.... do some work, get the value for ret

      return ret;
    }
}

我的问题是我看到一些教程说我们应该避免使用.result,因为它可能导致死锁.在我的情况下,我不确定是否需要使用async/await?如果我确实需要,我知道我应该一直异步,但我确实想让我的controlLayer同步,因为我有其他层调用controlLayer的函数,我不希望所有图层的函数都是异步的,结果是Task <>,这是异步同步的情况吗?我想念一下吗?任何建议表示赞赏.谢谢!

2 个回答
  • 我确实希望我的controlLayer是同步的,因为我有其他层调用controlLayer的函数,我不希望所有图层的函数都是异步的,结果是Task <>

    我建议你重新考虑一下.Web请求是一种基本的异步操作,因此我建议您将"控制层"公开为异步API,并允许async通过代码库中的层"增长".

    但是,如果您确实需要同步API,那么您应该只调用同步API.例如,使用WebClient而不是HttpClient.不要打电话Result来包装异步API与同步API.

    2023-02-13 10:08 回答
  • 您只需要使用async并且await如果您的代码是异步的 - 例如,如果它同时调度多个请求,则在发送请求后执行工作,而不是仅阻塞直到响应到达.

    暂时忽略死锁问题 - 如果您的代码只是同步,那就是:每次发送请求时,您只需等待响应,然后再执行其他操作,您就不需要使用await也可以使用Result.看到这个问题进行类似的辩论.或者,您可以使用同步API(例如WebClient在评论和其他答案中建议).

    至于Result相关的死锁,我建议您阅读MSDN上的这篇文章,以便更好地了解发生的情况和原因.如果你正在写一个简单的控制台应用程序,你并不需要担心它(应对正确的方式使用它是只让Main方法的非异步,并使用ResultWait有).

    2023-02-13 10:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有