Должен ли я вызвать Close на HttpWebResponse, даже если он находится внутри оператора using? - PullRequest
18 голосов
/ 03 февраля 2009

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

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

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

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

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

Ответы [ 4 ]

28 голосов
/ 03 февраля 2009

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

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

16 голосов
/ 03 февраля 2009

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

1 голос
/ 03 февраля 2009

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

0 голосов
/ 03 февраля 2009

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

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

...