Нужно ли нам закрывать ResponseStream System.Net.WebRequest? - PullRequest
6 голосов
/ 12 сентября 2011

Мне было интересно, получу ли я в итоге какие-нибудь незаполненные потоки из этого кода:

   Public Function [Get](ByVal url As String) As String
        Using reader = New System.IO.StreamReader(System.Net.WebRequest.Create(url).GetResponse.GetResponseStream)
            Return reader.ReadToEnd
        End Using
    End Function

Как насчет этого:

  Public Function Get2(ByVal url As String) As String
        Using stream = System.Net.WebRequest.Create(url).GetResponse.GetResponseStream
            Using reader = New System.IO.StreamReader(stream)
                Return reader.ReadToEnd
            End Using
        End Using
    End Function

По сути, нужно ли нам закрывать System.Net.WebRequest s ResponseStream?

Ответы [ 2 ]

7 голосов
/ 12 сентября 2011

Вы либо должны закрыть поток ответа , либо вам необходимо закрыть ответ. Обратите внимание, что закрытие 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 вопросов, где люди получают тайм-ауты из-за того, что ничего не закрывают.

2 голосов
/ 12 сентября 2011

Нет необходимости вызывать метод Close на WebResponse, но это не вредно

http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

...