System.Net.Http.HttpClient dan System.Net.Http.HttpClientHandler di .NET Framework 4.5 mengimplementasikan IDisposable (via System.Net.Http.HttpMessageInvoker ).
The using
dokumentasi pernyataan mengatakan:
Sebagai aturan, ketika Anda menggunakan objek IDisposable, Anda harus mendeklarasikan dan membuat instance dalam pernyataan menggunakan.
Jawaban ini menggunakan pola ini:
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();
}
Tetapi contoh-contoh yang paling terlihat dari Microsoft tidak memanggil Dispose()
secara eksplisit atau implisit. Misalnya:
- The artikel blog asli mengumumkan relase dari HttpClient.
- Dokumentasi MSDN sebenarnya untuk HttpClient.
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
Dalam komentar pengumuman , seseorang bertanya kepada karyawan Microsoft:
Setelah memeriksa sampel Anda, saya melihat bahwa Anda tidak melakukan tindakan buang pada contoh HttpClient. Saya telah menggunakan semua contoh HttpClient dengan menggunakan pernyataan pada aplikasi saya dan saya pikir itu adalah cara yang benar sejak HttpClient mengimplementasikan antarmuka IDisposable. Apakah saya di jalan yang benar?
Jawabannya adalah:
Secara umum itu benar meskipun Anda harus berhati-hati dengan "menggunakan" dan async karena mereka tidak benar-benar bercampur. Net 4, Dalam. Net 4.5 Anda dapat menggunakan "menunggu" di dalam pernyataan "menggunakan".
Btw, Anda dapat menggunakan kembali HttpClient yang sama sebanyak yang Anda suka sehingga biasanya Anda tidak akan membuat / membuangnya setiap saat.
Paragraf kedua berlebihan untuk pertanyaan ini, yang tidak peduli berapa kali Anda dapat menggunakan contoh HttpClient, tetapi tentang apakah perlu untuk membuangnya setelah Anda tidak lagi membutuhkannya.
(Pembaruan: sebenarnya paragraf kedua adalah kunci untuk jawabannya, seperti yang disediakan di bawah ini oleh @DPeden.)
Jadi pertanyaan saya adalah:
Apakah perlu, mengingat implementasi saat ini (.NET Framework 4.5), untuk memanggil Buang () pada instance HttpClient dan HttpClientHandler? Klarifikasi: oleh "perlu" Maksud saya jika ada konsekuensi negatif untuk tidak membuang, seperti kebocoran sumber daya atau risiko korupsi data.
Jika tidak perlu, apakah itu akan menjadi "praktik yang baik" karena mereka menerapkan IDisposable?
Jika perlu (atau disarankan), apakah kode ini yang disebutkan di atas mengimplementasikannya dengan aman (untuk .NET Framework 4.5)?
Jika kelas-kelas ini tidak perlu memanggil Buang (), mengapa mereka diimplementasikan sebagai IDisposable?
Jika mereka memerlukan, atau jika itu adalah praktik yang disarankan, apakah contoh Microsoft menyesatkan atau tidak aman?
Flush
satu demi satu setiap penulisan, dan selain ketidaknyamanan terus menahan sumber daya yang mendasari lebih lama dari yang diperlukan, apa yang tidak akan terjadi yang diperlukan untuk "perilaku yang benar"?