Hat Httpresponse-Arbeit in einem „mit“ Block ohne eine explizite response.close ()
-
05-07-2019 - |
Frage
Ich habe versucht, eine Klarstellung dieses zu erhalten:
Method-1:
Dim request = CreateRequest(uri) //some uri
Dim response = DirectCast(request.GetResponse, HttpWebResponse)
response.Close()
Method-2:
Dim request = Createrequest(uri)
Using response = DirectCast(request.GetResponse, HttpWebResponse)
End Using
Wenn ich beide Verfahren-1 verwendet und Method-2 auf meinem lokalen Rechner eine Antwort von einem entfernten Rechner X zu verbinden und beide von ihnen arbeiteten richtig.
Wenn ich diesen Code verwendet, auf einem entfernten Rechner Y-Antwort von X zu erhalten, nur die Methode-1 arbeitet, und für Method-2, erhalte ich
System.Net.WebException: The operation has timed out
Was ist der Unterschied zwischen dem oben genannten Verfahren und was könnte das mögliche Problem sein?
Lösung
Using
einfach übersetzt in einen Try
/ Finally
Block, der .Dispose()
im Finally
Block aufruft. Sie können mit Reflector finden, welcher Code generiert wird. Sie können auch einen Blick auf nehmen verwenden, was für ein Verfahren der Fall ist. In diesem Fall funktioniert die Dispose()
Methode auf HttpWebResponse
nicht das gleiche tun wie Close()
das heißt, es hat in der Tat semantische Unterschiede hier.
Using
hat in der Regel den Vorteil von einem Objekt verwendete Ressourcen freigegeben werden sofort, wenn sie aus dem Geltungsbereich. Dies ist nützlich für Dinge wie GDI + oder Datei-Handles, aber im Fall von HttpWebResponse
es könnte ein wenig anders sein. Nicht zu wissen genug über dieses Objekt meiner Vermutung wäre, dass es Close()
ing wirklich keine Ressourcen freigeben, so gibt es keine Notwendigkeit für Dispose()
Close()
auch nennt. Und vielleicht gibt es gute Gründe für dieses Verhalten.