Должен ли я вызывать Close для HttpWebResponse , даже если он находится внутри инструкции using?

StackOverflow https://stackoverflow.com/questions/505231

Вопрос

У меня есть какой-то код, например, этот код используется очень сильно:

using (HttpWebResponse r = _GetHttpWebResponse(uri, body, method, contentType, headers)) {
    /* do something with the response */

    /* call r.Close() explicitly? */
}

Сегодня код работает нормально, но соединения с сервером остаются открытыми довольно долгое время.(проверено с помощью TCPView)

Есть ли польза в том, чтобы вызвать Close() метод явно?Рекомендуется ли это или, может быть, не рекомендуется этого делать, и почему?

Это было полезно?

Решение

Если у вас есть значительный код внутри using после того, как вы закончили использовать ответ, то убедитесь, что вызов close в порядке.Однако вы, возможно, захотите рассмотреть возможность рефакторинга вашего кода, чтобы код, который не нуждается в ответе, не находился внутри блока using.

Тем не менее, закрытие ответа не обязательно закрывает соединение.Протокол HTTP / 1.1 предусматривает, что соединение остается открытым для ускорения последующих запросов.

Другие советы

Когда Dispose() вызывается на WebResponse (HttpWebReponseбазовый класс), он вызывает это Close() метод для вас.Быстрый взгляд с помощью Рефлектора подтверждает это.

Редактировать (в ответ на комментарий):Если это уже вызвано для вас, зачем вызывать это явно?Ради ясности?Я думаю, что если люди поймут, что using (X x = ...) утверждение, они поймут, что это закрывает базовое соединение.Вы ничего не получите, вызывая его явно в этом случае.

В using ключевое слово - это синтаксический сахар для try/finally блок, который оборачивается вокруг вашего HttpWebResponse, поскольку он реализует IDisposable.Когда в finally предложение, оно вызовет Dispose() метод, который будет вызывать Close().Это означает, что вам не нужно явно вызывать Close() способ.

Я полагаю, что Close - это метод, который реализует IDisposable.Dispose, поэтому определенно нет необходимости вызывать метод Close заранее.Это полностью избыточно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top