2009-02-02 6 views
18

Ich habe einen Code wie, dieser Code wird verwendet sehr schwer:Sollte ich Close auf HttpWebResponse aufrufen, selbst wenn es in einer using-Anweisung ist?

using (HttpWebResponse r = _GetHttpWebResponse(uri, body, method, contentType, headers)) { 
    /* do something with the response */ 

    /* call r.Close() explicitly? */ 
} 

Der Code funktioniert heute gut, aber die Verbindungen zum Server bleiben für einige Zeit offen. (überprüft mit TCPView)

Gibt es einen Vorteil, die Close()-Methode explizit aufzurufen? Wird es empfohlen, oder vielleicht empfohlen, es nicht zu tun, und warum?

+0

Ich denke, das beantwortet meine Frage: http://stackoverflow.com/questions/45036/will-the-gc-call-idisposabledispose-for-me – BlackTigerX

+0

Nr Ob die Finalizerthread Anrufe verfügen oder nicht, ist eine sehr anderes Problem. –

Antwort

0

Wenn Sie signifikanten Code in der Verwendung haben, nachdem Sie die Antwort verbraucht haben, dann ist das Schließen der Verbindung ok. Sie sollten jedoch in Erwägung ziehen, Ihren Code zu refactorieren, sodass Code, der die Antwort nicht benötigt, nicht im using-Block enthalten ist.

Das Schließen der Antwort schließt nicht unbedingt die Verbindung. Das HTTP/1.1-Protokoll sorgt dafür, dass die Verbindung offen bleibt, um nachfolgende Anfragen schneller zu erledigen.

+1

FWIW, der erste Satz dieser Antwort muss sorgfältig gelesen werden. Es wäre klarer, am Anfang damit zu beginnen, dass 'using' für dich" schließt ", wie andere Antworten es tun - du musst es nicht selbst anrufen.Sobald Sie sich darüber im Klaren sind, können Sie verstehen, was der Satz sagt: Wenn Sie aus irgendeinem Grund in der Mitte des "using" -Blocks "schließen" (Ressourcen freigeben) wollen, dann tun Sie das - aber Ein saubereres Design wäre, * nur innerhalb des using Blocks zu halten, Code, der das Ergebnis * verwendet. – ToolmakerSteve

26

Wenn Dispose() auf WebResponse (HttpWebReponse ‚s Basisklasse) aufgerufen wird, ruft es Close() Methode für Sie. Ein kurzer Blick mit Reflektor bestätigt dies.

Edit (als Antwort auf Kommentar): Wenn es schon für Sie aufgerufen wird, warum rufen Sie es explizit? Aus Gründen der Klarheit? Ich denke, wenn Leute die using (X x = ...) Aussage verstehen, verstehen sie, dass es die zugrundeliegende Verbindung schließt. Sie erhalten nichts, wenn Sie es in diesem Fall explizit aufrufen.

+0

Ich weiß es, die Frage ist, ob ich anrufen sollte. Schließen Sie sowieso – BlackTigerX

+0

Sie haben Recht, "mit" ruft die Dispose, ruft GC die Finalize – BlackTigerX

+0

Cool, froh, es zu hören. Tut mir leid, es war nicht die richtige Antwort für dich. –

1

Ich glaube Close ist die Methode, die IDisposable.Dispose implementiert, daher gibt es definitiv keine Notwendigkeit, die Close-Methode vorher aufzurufen. Es ist vollständig redundant.

+0

Eine Methode namens "Close" kann ein Interface-Mitglied namens "Dispose" nicht implementieren. Man kann den anderen nennen, aber sie sind unterschiedliche Methoden. – harpo

+0

Nicht ganz richtig. In VB.NET ist dies tatsächlich möglich. Es ist nur in C#, dass es (technisch) nicht ist, obwohl man es sehr leicht nachahmen kann. – Noldorin

+0

Ich stehe korrigiert. http://StackOverflow.com/Questions/5533659/in-c-is-ist-possible-to-implement-an-interface-member-use-a-member-with-a-dif – harpo

15

Das using Schlüsselwort ist ein syntaktischer Zucker für try/finally Block, der um den HttpWebResponse Wraps, da es IDisposable implementiert. Wenn in der finally Klausel, wird es die Dispose() Methode aufrufen, die Close() aufrufen wird. Das bedeutet, dass Sie die Methode Close() nicht explizit aufrufen müssen.

Verwandte Themen