Работает ли HttpResponse в блоке «using» без явного response.close () - PullRequest
0 голосов
/ 22 октября 2009

Я пытался получить разъяснение по этому поводу:

Способ-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

В чем разница между методами, упомянутыми выше, и в чем может быть возможная проблема?

1 Ответ

1 голос
/ 22 октября 2009

Using просто переводится в блок Try / Finally, который вызывает .Dispose() в блоке Finally. Вы можете использовать Reflector , чтобы найти, какой код генерируется. Вы также можете использовать его, чтобы взглянуть на то, что делает метод. В этом случае метод Dispose() в HttpWebResponse делает , а не делает то же самое, что и Close(), что означает, что здесь на самом деле есть семантические различия.

Using обычно имеет то преимущество, что высвобождает ресурсы, используемые объектом сразу же, когда он выходит из области видимости. Это полезно для таких вещей, как GDI + или файловые дескрипторы, но в случае HttpWebResponse это может быть немного по-другому. Не зная достаточно об этом конкретном объекте, я предполагаю, что Close() он действительно не высвобождает никаких ресурсов, поэтому нет необходимости в Dispose() вызовах Close(). И, возможно, есть веские причины для такого поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...