静态Httpclient在并发情况下的表现如何?

问题描述 投票:0回答:1

我知道很多人之前已经讨论过这个并且同意Httpclient最好被实例化一次并用于整个应用程序。我对这一点有一些疑问。

假设我有一个带有静态Httpclient变量的业务层类(带有双重检查锁),并且一个网页创建了一个业务层类的对象。

班级代码:

  public class BL
{
    //Lock object for double lock check
    private static readonly object padlock = new object();
    public static HttpClient httpClient;

    public BL()
    {
        if (httpClient == null)
        {
            lock (padlock)
            {
                if (httpClient == null)
                {
                    httpClient = new HttpClient();
                }

            }
        }
    }

    public async Task<HttpResponseMessage> GetData(String URL)
    {
       return await httpClient.GetAsync(URL).ConfigureAwait(false);
    }
}

页面代码

protected void Page_Load(object sender, EventArgs e)
    {
        BL blObj = new BL();
        HttpResponseMessage response = blObj.GetData("http://....");
    }
  1. 静态变量在整个应用程序生命周期中保持活这意味着只要主机IIS和Web应用程序处于活动状态(即使在创建BL对象的页面的生命周期结束之后),或者只是活着直到页面被释放,静态httpclient才会生效?
  2. 如果有多个并发页面,例如500个创建了BL对象并使用了静态httpclient,那么如何通过一个仅与服务器启用一个http连接的静态httpclient来提供500个用户?我不能得到那个。
  3. 是否有可靠的可视化工作室工具来测试上述代码的负载和性能?
c# concurrency httpclient static-variables
1个回答
0
投票
  1. 静态字段一直存在,直到AppDomain被释放,这是因为它们不属于对象实例,因此它们不会被CGed。在IIS情况下,根据您在IIS中的设置,如果应用程序池未被回收,它将永远存在。
  2. 是的,静态客户端obj将服务于整个500并发请求,但是如果HttpClient是一个线程安全对象,则需要非常小心。如果没有,你最好试试这种方式:创建一个HttpClient池,将状态绑定到池中的每个HttpClient对象,在BL对象尝试获取数据时获取池中的空闲HttpClient
  3. VS获得了很多性能工具,MS发布了一个名为VSPerfASPNetCmd的性能工具来监控CPU使用率,内存使用情况,你可以参考下面的页面了解详情https://docs.microsoft.com/en-us/visualstudio/profiling/vsperfaspnetcmd?view=vs-2017
© www.soinside.com 2019 - 2024. All rights reserved.