Lind.DDD.Utils.HttpHelper關于對HttpClient的正確使(shi)用
官方的不一定是對的,機器最能證明一切
不知道從什么時候起,我們在寫數據庫連接,網絡連接,文件操作時會習慣加上using,這種習慣被我們誤稱為一種模式,但事實上,一切事情都有因有果的,使用using的作用是什么?我想這個問題大家都知道應該,它(ta)可以(yi)釋(shi)放(fang)資源,而對于數據庫(ku)連(lian)接(jie)來(lai)說(shuo),它(ta)不是釋(shi)放(fang)數據連(lian)接(jie),而只是把(ba)連(lian)接(jie)放(fang)里“連(lian)接(jie)池”,等待(dai)下次(ci)使用時(shi),直接(jie)用池子里取出來(lai)即(ji)可,好處(chu)當然就(jiu)是省去了很多“建(jian)立連(lian)接(jie)”時(shi)的開銷(xiao),而不(bu)(bu)對網絡連接來說(shuo),則不(bu)(bu)是那么(me)簡單(dan)了(le),不(bu)(bu)能(neng)一同而義,這點(dian)對于MSDN也有錯誤的(de)說(shuo)法(fa)和寫法(fa),最近在看(kan)博文時(shi)(老(lao)外的(de),Infoq上翻(fan)譯(yi)的(de))給出(chu)了(le)有利(li)的(de)證(zheng)據,具(ju)體看(kan)下文。
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; }
對于(yu)上面(mian)的(de)(de)代碼,也是MSDN推薦的(de)(de)寫法,即(ji)在使用(yong)完網(wang)絡資(zi)源(yuan)后,自(zi)動釋(shi)放它,而對于(yu)下一(yi)次網(wang)絡資(zi)源(yuan)的(de)(de)訪問(wen),還需要從(cong)新(xin)去構建(jian)(jian),事實上,從(cong)資(zi)源(yuan)的(de)(de)銷(xiao)毀到下次資(zi)源(yuan)的(de)(de)建(jian)(jian)立需要很大的(de)(de)代價,而且(qie)你的(de)(de)網(wang)絡連(lian)接(jie)(jie)的(de)(de)構建(jian)(jian)(套接(jie)(jie)字)是有限制(zhi)的(de)(de),并不是無窮無近的(de)(de),所以,我們必(bi)須要進行控(kong)制(zhi)。
相關中文文章:
相關英文文章:
下面是大(da)叔對using方式(shi)進行的測試,可以通過截圖看到,我們的TCP連(lian)接(jie)有很多,這樣當高并(bing)發情況下,你的套接(jie)字連(lian)接(jie)將會被用(yong)斤。
可用(yong)套接字耗盡后可能(neng)出現這(zhe)樣的異(yi)常: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("//www.sina.com").Result; } sw.Stop(); Console.WriteLine("1000個請(qing)求(qiu)的時間" + sw.ElapsedMilliseconds); }
修改之后(hou),我們可以看(kan)到整個HttpClient的測試性能有(you)了明顯的提(ti)升!
對(dui)于控制臺(tai)輸(shu)出(chu)的TCP連接(jie)情(qing)況(kuang),我們(men)也只看到(dao)(dao)一(yi)條相關的數(shu)據(ju),這也是(shi)我們(men)希望看到(dao)(dao)的!
netstat -nbp | findstr 202.108.33.107
結果
最后,感謝Infoq的(de)編輯(ji)“謝麗(li)”找了這么好的(de)一(yi)篇文章,辛苦了!