System.Net.Http.HttpClient и System.Net.Http.HttpClientHandler в.NET Framework 4.5 реализуют 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();
}
Но наиболее заметные примеры из Microsoft не вызывают Dispose()
явно или неявно. Например:
- Оригинальная статья в блоге, в которой говорится о передаче HttpClient.
- Фактическая документация MSDN для HttpClient.
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
В комментариях к анонсу кто-то спросил сотрудника Microsoft:
После проверки ваших образцов я увидел, что вы не выполнили действие dispose на экземпляре HttpClient. Я использовал все экземпляры HttpClient с помощью инструкции в своем приложении, и я подумал, что это правильный путь, поскольку HttpClient реализует интерфейс IDisposable. Я на правильном пути?
Его ответ был:
В общем, это правильно, хотя вы должны быть осторожны с "использованием" и асинхронно, поскольку они не "смешиваются".Net 4, In.Net 4.5 вы можете использовать "ожидание" внутри инструкции "using".
Кстати, вы можете повторно использовать один и тот же HttpClient столько раз [как] вам нравится, что обычно вы не будете создавать/удалять их все время.
Второй абзац излишним в этом вопросе, который не беспокоится о том, сколько раз вы можете использовать экземпляр HttpClient, но о том, нужно ли его утилизировать после того, как он вам больше не нужен.
(Обновление: фактически, второй абзац является ключом к ответу, как описано ниже в разделе @DPeden.)
Поэтому мои вопросы:
-
Нужно ли, учитывая текущую реализацию (.NET Framework 4.5), вызвать Dispose() в экземплярах HttpClient и HttpClientHandler? Уточнение: "обязательно" я имею в виду, если есть какие-либо негативные последствия для не утилизации, такие как утечка ресурсов или риски коррупции данных.
-
Если это не обязательно, будет ли это "хорошей практикой", так как они реализуют IDisposable?
-
Если это необходимо (или рекомендуется), является ли упомянутый выше код безопасным (для.NET Framework 4.5)?
-
Если эти классы не требуют вызова Dispose(), почему они были реализованы как IDisposable?
-
Если они требуют или, если это рекомендуемая практика, являются примерами Microsoft, вводящими в заблуждение или небезопасными?