Должен ли я вызывать Close для HttpWebResponse , даже если он находится внутри инструкции using?
-
21-08-2019 - |
Вопрос
У меня есть какой-то код, например, этот код используется очень сильно:
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 заранее.Это полностью избыточно.