程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Lind.DDD.Utils.HttpHelper關於對HttpClient的正確使用,httpclient

Lind.DDD.Utils.HttpHelper關於對HttpClient的正確使用,httpclient

編輯:C#入門知識

Lind.DDD.Utils.HttpHelper關於對HttpClient的正確使用,httpclient


回到目錄

官方的不一定是對的,機器最能證明一切

不知道從什麼時候起,我們在寫數據庫連接,網絡連接,文件操作時會習慣加上using,這種習慣被我們誤稱為一種模式,但事實上,一切事情都有因有果的,使用using的作用是什麼?我想這個問題大家都知道應該,它可以釋放資源,而對於數據庫連接來說,它不是釋放數據連接,而只是把連接放裡“連接池”,等待下次使用時,直接用池子裡取出來即可,好處當然就是省去了很多“建立連接”時的開銷,而不對網絡連接來說,則不是那麼簡單了,不能一同而義,這點對於MSDN也有錯誤的說法和寫法,最近在看博文時(老外的,Infoq上翻譯的)給出了有利的證據,具體看下文。

using的寫法其實就是對IDispose模塊的實現 

  using (var http = new HttpClient(handler))
   {
    http.Timeout = new TimeSpan(0, 0, timeOut);
    HttpResponseMessage response;
    response = http.GetAsync(GeneratorUri(requestUri, ApiValidateHelper.GenerateCipherText(nv))).Result;
    return response;
   }

對於上面的代碼,也是MSDN推薦的寫法,即在使用完網絡資源後,自動釋放它,而對於下一次網絡資源的訪問,還需要從新去構建,事實上,從資源的銷毀到下次資源的建立需要很大的代價,而且你的網絡連接的構建(套接字)是有限制的,並不是無窮無近的,所以,我們必須要進行控制。

相關中文文章:http://www.infoq.com/cn/news/2016/09/HttpClient

相關英文文章:http://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

下面是大叔對using方式進行的測試,可以通過截圖看到,我們的TCP連接有很多,這樣當高並發情況下,你的套接字連接將會被用斤。

可用套接字耗盡後可能出現這樣的異常:System.Net.Sockets.SocketException!

改進後的程序(單例或者靜態化的HttpClient)

   readonly static HttpClient http = new HttpClient(new HttpClientHandler()
        {
            AutomaticDecompression = System.Net.DecompressionMethods.GZip
        });
        [TestMethod]
        public void Get()
        {
            Stopwatch sw = new Stopwatch();
            sw.Restart();
            for (int i = 0; i < 1000; i++)
            {
                var response = http.GetAsync("http://www.sina.com").Result;
            }
            sw.Stop();
            Console.WriteLine("1000個請求的時間" + sw.ElapsedMilliseconds);
        }

修改之後,我們可以看到整個HttpClient的測試性能有了明顯的提升!

對於控制台輸出的TCP連接情況,我們也只看到一條相關的數據,這也是我們希望看到的!

netstat -nbp | findstr 202.108.33.107

結果

最後,感謝Infoq的編輯“謝麗”找了這麼好的一篇文章,辛苦了!

回到目錄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved