Работает ли HttpResponse в блоке “using” без явного ответа.close()
-
05-07-2019 - |
Вопрос
Я пытался получить разъяснения по этому поводу:
Способ-1:
Dim request = CreateRequest(uri) //some uri
Dim response = DirectCast(request.GetResponse, HttpWebResponse)
response.Close()
Способ-2:
Dim request = Createrequest(uri)
Using response = DirectCast(request.GetResponse, HttpWebResponse)
End Using
Когда я использовал оба метода-1 и Метод-2 на своем локальном компьютере для подключения и получения ответа от удаленной машины X, оба они работали должным образом.
Когда я использовал этот код на удаленной машине Y для получения ответа от X, работал только Метод-1, а для Метода-2 я получаю
System.Net.WebException: The operation has timed out
В чем разница между Методами , упомянутыми выше , и в чем может быть возможная проблема ?
Решение
Using
просто переводится в Try
/Finally
блок, который вызывает .Dispose()
в Finally
блок.Вы можете использовать Отражатель чтобы узнать, какой код генерируется.Вы также можете использовать его, чтобы взглянуть на то, что делает метод.В этом случае, Dispose()
способ на HttpWebResponse
делает не сделайте то же самое , что и Close()
это означает, что здесь на самом деле есть семантические различия.
Using
обычно преимущество заключается в том, что ресурсы, используемые объектом, освобождаются немедленно, когда он выходит за пределы области видимости.Это полезно для таких вещей, как GDI + или дескрипторы файлов, но в случае HttpWebResponse
это могло бы быть немного по-другому.Не зная достаточно об этом конкретном объекте, я бы предположил, что Close()
на самом деле это не высвобождает никаких ресурсов, поэтому нет необходимости в Dispose()
звонки Close()
слишком.И, возможно, для такого поведения есть веские причины.