Нужно ли удалять HttpClient и HttpClientHandler?

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.BingTranslateSampleGoogleMapsSampleWorldBankSample

вобъявлениеВ комментариях кто-то спросил сотрудника 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 вводят в заблуждение или небезопасны?

Ответы на вопрос(11)

Ваш ответ на вопрос