.NET Framework 4.5'te System.Net.Http.HttpClient ve System.Net.Http.HttpClientHandler IDisposable'ı ( System.Net.Http.HttpMessageInvoker aracılığıyla ) uygular .
using
Deyimi belgelerine diyor ki:
Kural olarak, IDisposable nesnesini kullandığınızda, bunu bir using deyiminde bildirmeli ve başlatmalısınız.
Bu cevap şu kalıbı kullanır:
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();
}
Ancak Microsoft'tan en görünür örnekler Dispose()
açık ya da dolaylı olarak çağrılmaz . Örneğin:
- Orijinal blog makale HttpClient serbest bırakılmasını ünler duyuran.
- HttpClient için gerçek MSDN belgeleri .
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
Gelen duyuru 'yorumlarınıza s, birisi Microsoft çalışanı sordu:
Örneklerinizi kontrol ettikten sonra, HttpClient örneğinde atma işlemini yapmadığınızı gördüm. Uygulamamdaki ifadeyi kullanarak HttpClient'in tüm örneklerini kullandım ve HttpClient IDisposable arabirimini uyguladığı için doğru yol olduğunu düşündüm. Doğru yolda mıyım?
Cevabı şuydu:
Genel olarak doğrudur, ancak "kullanarak" ve async ile dikkatli olmak zorunda olmasına rağmen onlar gerçekten .Net 4, .Net 4.5 içinde bir "kullanma" deyimi içinde "beklemek" kullanabilirsiniz.
Btw, aynı HttpClient'i istediğiniz gibi tekrar kullanabilirsiniz, böylece genellikle her zaman oluşturmaz / atamazsınız.
İkinci paragraf, bir HttpClient örneğini kaç kez kullanabileceğinizle ilgili değil, artık ihtiyacınız kalmadan atmanızın gerekip gerekmediği ile ilgili olan bu soru için gereksizdir.
(Güncelleme: aslında, @DPeden tarafından sağlanan yanıtın anahtarı ikinci paragraftır.)
Yani sorularım:
Geçerli uygulama (.NET Framework 4.5) göz önüne alındığında, HttpClient ve HttpClientHandler örneklerinde Dispose () öğesini çağırmak gerekli mi? Açıklama: "gerekli" ile, kaynak sızıntısı veya veri bozulması riskleri gibi bertaraf edilmemenin olumsuz sonuçları varsa kastediyorum.
Gerekli değilse, IDisposable'ı uyguladıkları için zaten "iyi bir uygulama" olur mu?
Gerekirse (veya önerilirse), yukarıda belirtilen bu kod güvenli bir şekilde uygulanıyor mu (.NET Framework 4.5 için)?
Bu sınıflar Dispose () çağrılmasını gerektirmiyorsa, neden IDisposable olarak uygulandılar?
Gerekiyorsa veya önerilen bir uygulamasa, Microsoft örnekleri yanıltıcı mı yoksa güvensiz mi?
Flush
her yazma işleminden sonra birini arayabilir ve temel kaynakları gereğinden fazla tutmaya devam etmesinin zorluğunun dışında, "doğru davranış" için gerekli olmayan ne olmaz?