文章出處

回到目錄

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

不知道從什么時候起,我們在寫數據庫連接,網絡連接,文件操作時會習慣加上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的編輯“謝麗”找了這么好的一篇文章,辛苦了!

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()