System.Net.Http.HttpClient і System.Net.Http.HttpClientHandler в .NET Framework 4.5 реалізують IDisposable (через System.Net.Http.HttpMessageInvoker ).
Документація 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();
}
Але найбільш видимі приклади від Microsoft не називають Dispose()
явно або неявно. Наприклад:
- Оригінальний блог стаття оголошує про HttpClient розблокування , .
- Фактична документація MSDN для HttpClient.
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
У оголошення «S коментарі, хто - то запитав співробітник Microsoft:
Перевіривши ваші зразки, я побачив, що ви не здійснили розпорядження в екземплярі HttpClient. Я використовував усі екземпляри HttpClient із використанням заяви на своєму додатку, і я вважав, що це правильний шлях, оскільки HttpClient реалізує інтерфейс IDisposable. Я на вірному шляху?
Його відповідь:
Взагалі це правильно, хоча вам потрібно бути обережними з використанням та використанням асинхронізації, оскільки вони дійсно не змішуються.
До речі, той самий HttpClient ви можете повторно використовувати стільки разів, скільки вам подобається, як правило, ви не будете створювати / розпоряджатися ними постійно.
Другий абзац зайвий у цьому питанні, яке не стосується того, скільки разів ви можете використовувати екземпляр HttpClient, а про те, чи потрібно його розпоряджатися після того, як він вам більше не потрібен.
(Оновлення: адже другий абзац є ключем до відповіді, як надано нижче @DPeden.)
Тому мої запитання:
Чи потрібно, враховуючи поточну реалізацію (.NET Framework 4.5), викликати Dispose () в екземплярах HttpClient та HttpClientHandler? Пояснення: під "необхідним" я маю на увазі, якщо є якісь негативні наслідки для нерозпорядження, такі як витоки ресурсів або ризик корупції даних.
Якщо це не потрібно, чи це все-таки "хороша практика", оскільки вони реалізують IDisposable?
Якщо це необхідно (або рекомендовано), чи вказаний вище код безпечно реалізує його (для .NET Framework 4.5)?
Якщо для цих класів не потрібно викликати Dispose (), чому вони були реалізовані як IDisposable?
Якщо вони вимагають, або якщо це рекомендована практика, чи є приклади Microsoft оманливими чи небезпечними?
Flush
один раз після кожного запису, і крім незручностей, якщо він продовжує тримати основні ресурси довше, ніж потрібно, що не відбудеться, що потрібно для "правильної поведінки"?