18

私は次のようなコードを持っています。このコードは非常に頻繁に使用されます。

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

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

コードは今日は正常に機能しますが、サーバーへの接続はかなり長い間開いたままになります。(TCPViewを使用してチェック)

Close()メソッドを明示的に呼び出すことには利点がありますか?それは推奨されますか、それとも行わないことが推奨されますか、そしてその理由は何ですか?

4

4 に答える 4

30

が(の基本クラス) で呼び出されると、そのDispose()メソッドが呼び出されます。これは、Reflector を使用して一目で確認できます。WebResponseHttpWebReponseClose()

編集(コメントへの応答):すでに呼び出されている場合、なぜ明示的に呼び出すのですか?間違いがないように?人々がそのusing (X x = ...)声明を理解すれば、それが根底にあるつながりを閉じていることを理解できると思います. この場合、明示的に呼び出しても何も得られません。

于 2009-02-02T22:32:20.787 に答える
18

usingキーワードはブロックのシンタックス シュガーであり、 を実装しているためtry/finally、 をラップします。節内では、メソッドを呼び出します。メソッドは を呼び出します。つまり、メソッドを明示的に呼び出す必要はありません。HttpWebResponseIDisposablefinallyDispose()Close()Close()

于 2009-02-02T22:33:31.377 に答える
1

Close は IDisposable.Dispose を実装するメソッドだと思うので、事前に Close メソッドを呼び出す必要はまったくありません。完全に冗長です。

于 2009-02-02T22:33:05.450 に答える
0

応答の消費が終了した後に using 内に重要なコードがある場合は、close を呼び出しても問題ないことを確認してください。ただし、応答を必要としないコードが using ブロック内にないように、コードのリファクタリングを検討することをお勧めします。

つまり、応答を閉じても、必ずしも接続が閉じられるわけではありません。HTTP/1.1 プロトコルは、後続の要求をより迅速に行うために、接続を開いたままにするための準備をします。

于 2009-02-02T22:33:48.490 に答える