. net Framework 4.5中的System.Net.Http.HttpClient和System.Net.Http.HttpClientHandler实现了IDisposable(通过System.Net.Http.HttpMessageInvoker)。
using
语句文档说:
作为规则,当你使用IDisposable对象时,你应该声明和 在using语句中实例化它
这个答案使用这个模式:
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()
。例如:
在公告的评论中,有人问微软员工:
在检查了你的样本后,我看到你没有执行处理 对HttpClient实例的操作。我已经使用了HttpClient的所有实例 在我的应用程序上使用声明,我认为这是正确的方式 因为HttpClient实现了IDisposable接口。我是在 正确的道路?< / p >
他的回答是:
一般来说,这是正确的,尽管你必须小心 "using"和async,因为它们在。net 4和。net 4.5中不能真正混合
? 顺便说一句,你可以重用同一个HttpClient任意多次 通常你不会一直创建/处理它们
第二段对这个问题来说是多余的,它不关心您可以使用HttpClient实例多少次,而是关心在您不再需要它之后是否有必要处理它。
(更新:事实上,第二段是答案的关键,如下文由@DPeden提供。)
所以我的问题是:
考虑到当前的实现(。NET Framework 4.5),在HttpClient和HttpClientHandler实例上调用Dispose() ?澄清:我所说的“必要”是指如果不处理会产生任何负面后果,比如资源泄漏或数据损坏风险。
如果没有必要,那么既然他们实现了IDisposable,这是不是一个“好的实践”呢?
如果有必要(或推荐),此代码上面提到的安全实现它(对于.NET Framework 4.5)?
如果这些类不需要调用Dispose(),为什么它们被实现为IDisposable?
如果他们要求,或者这是一种推荐的做法,那么微软的例子是否具有误导性或不安全?