Вы либо должны закрыть поток ответа , либо вам необходимо закрыть ответ. Обратите внимание, что закрытие StreamReader
обёртыванием Stream
в любом случае закроет поток, поэтому первая версия должна быть в порядке. (Обратите внимание, что я считаю «распоряжение с помощью оператора Using» семантически равным «закрытию в блоке finally» - нет смысла явно вызывать Close
вместо простого удаления потока или ответа.)
Я считаю , что закрытие потока достаточно хорошо - что вам также не нужно закрывать ответ - и действительно это то, что MSDN заявляет , но лично я бы сделайте это для ясности:
Public Function [Get](ByVal url As String) As String
Using response = WebRequest.Create(url).GetResponse
Using reader = New System.IO.StreamReader(response.GetResponseStream)
Return reader.ReadToEnd
End Using
End Using
End Function
(здесь есть теоретическое преимущество в том, что он закроет ответ, если GetResponse
вернется успешно, но либо конструктор GetResponseStream
, либо StreamReader
выдает исключение. Я не ожидаю, что это любые практические последствия.)
Если вы не закроете что-нибудь , вы можете очень легко столкнуться с тайм-аутами в будущих запросах к тому же хосту - ответ "open" по существу приведет к разрыву соединения с этим хостом, и по умолчанию есть ограничение в два открытых соединения на хост. Это очень распространенная причина тайм-аутов - есть много SO вопросов, где люди получают тайм-ауты из-за того, что ничего не закрывают.