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 с оператором using в своем приложении, и я подумал, что это правильный путь, поскольку HttpClient реализует интерфейс IDisposable. Я на правильном пути?
Его ответ был:
В общем, это правильно, хотя вы должны быть осторожны с «использованием» и асинхронностью, поскольку они не смешиваются в .Net 4, в .Net 4.5 вы можете использовать «ожидание» внутри выражения «использование».
Кстати, вы можете повторно использовать один и тот же HttpClient столько раз, сколько вам нужно, поэтому обычно вы не будете создавать / распоряжаться ими все время.
Второй абзац лишний для этого вопроса, который касается не того, сколько раз вы можете использовать экземпляр HttpClient, а того, нужно ли его утилизировать после того, как он вам больше не нужен.
(Обновление: фактически, второй абзац является ключом к ответу, как указано ниже @DPeden.)
Итак, мои вопросы:
Необходимо ли, учитывая текущую реализацию (.NET Framework 4.5), вызывать Dispose () для экземпляров HttpClient и HttpClientHandler? Пояснение: под «необходимым» я подразумеваю, есть ли какие-либо негативные последствия для отказа от утилизации, такие как утечка ресурсов или риски повреждения данных.
Если в этом нет необходимости, будет ли это хорошей практикой, так как они реализуют IDisposable?
Если это необходимо (или рекомендуется), этот код, упомянутый выше, реализует его безопасно (для .NET Framework 4.5)?
Если эти классы не требуют вызова Dispose (), почему они были реализованы как IDisposable?
Если они требуют, или если это рекомендуемая практика, примеры Microsoft вводят в заблуждение или небезопасны?
Flush
одну запись после каждой записи, и, кроме неудобств, связанных с продолжением удержания базовых ресурсов дольше, чем необходимо, что не произойдет, что требуется для «правильного поведения»?