HttpClient和HttpClientHandler必須處理嗎?System.Net.Http.HttpClient和System.Net.Http.HttpClientHandler在.NET Framework4.5中實(shí)現(xiàn)IDisposable(通過System.Net.Http.HttpMessageInvoker).這個using聲明文件說:通常,當(dāng)您使用IDisposable對象時,您應(yīng)該在Using語句中聲明并實(shí)例化它。這個答案使用此模式:var baseAddress = new Uri("http://example.com");var cookieContainer = new CookieContainer();using (var handler = new HttpClientHandler()
{ CookieContainer = cookieContainer })using (var client = new HttpClient(handler) { BaseAddress = baseAddress }){
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("foo", "bar"),
new KeyValuePair<string, string>("baz", "bazinga"),
});
cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
var result = client.PostAsync("/test", content).Result;
result.EnsureSuccessStatusCode();}但是微軟最明顯的例子就是Dispose()無論是顯式的還是隱式的。例如:這個原創(chuàng)博客文章宣布HttpClient的相關(guān)信息。實(shí)際MSDN文檔為了HttpClient。Bing TranslateSampleGoogleMapsSampleWorldBankSample在公告有人問微軟員工:在檢查了您的示例之后,我發(fā)現(xiàn)您沒有對HttpClient實(shí)例執(zhí)行Dispose操作。我在我的應(yīng)用程序上使用了HttpClient的所有實(shí)例并使用了Use語句,并且我認(rèn)為這是正確的方法,因?yàn)镠ttpClient實(shí)現(xiàn)了IDisposable接口。我在正確的道路上嗎?他的回答是:一般來說,這是正確的,盡管您必須小心使用“和”異步“,因?yàn)樗鼈儾皇钦嬲旌显?NET 4中,在.NET 4.5中,您可以在”使用“語句中使用”等待“。順便說一句,您可以像您喜歡的那樣多次重用相同的HttpClient,所以通常不會一直創(chuàng)建/處理它們。對于這個問題,第二段是多余的,它不關(guān)心您可以使用HttpClient實(shí)例多少次,而是關(guān)心在不再需要HttpClient實(shí)例之后是否需要將它釋放。(更新:事實(shí)上,第二段是答案的關(guān)鍵,如下所示,由@DPeden提供。)所以我的問題是:考慮到當(dāng)前的實(shí)現(xiàn)(.NET Framework4.5),是否有必要在HttpClient和HttpClientHandler實(shí)例上調(diào)用Dispose()?澄清:我所說的“必要”是指如果不處理有任何負(fù)面后果,如資源泄漏或數(shù)據(jù)損壞風(fēng)險。如果沒有必要,這是否是一個“良好的實(shí)踐”,因?yàn)樗麄儗?shí)現(xiàn)了IDisposable?如果有必要(或建議),是這段代碼上面提到過安全地實(shí)現(xiàn)它(對于.NET Framework4.5)?如果這些類不需要調(diào)用dist(),為什么它們被實(shí)現(xiàn)為IDisposable?如果他們需要,或者如果這是一種推薦的做法,微軟的例子是誤導(dǎo)還是不安全?
3 回答

海綿寶寶撒
TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個贊
Dispose()
HttpClient
Dispose()
IDisposable
Dispose()
HttpClient
Dipose()
- 3 回答
- 0 關(guān)注
- 1370 瀏覽
添加回答
舉報
0/150
提交
取消