0

一部のサービスでメモリ リークと思われるものに気付き、リソースを適切に処理していることを確認しようとしています。外部 Http リクエストを送信するために使用される次のコードがあります。何か不足しているのか、それともusingステートメントが多すぎるのかはわかりません。

        string str = string.Empty;
        WebRequest request = WebRequest.Create(paramBuilder.ToString());
        request.ContentLength = 0;
        request.Method = "GET";
        using (WebResponse response = request.GetResponse())
        {
            using (Stream stream = response.GetResponseStream())
            {
                using (StreamReader reader = new StreamReader(stream))
                {
                    str = reader.ReadToEnd();

                    reader.Close();

                    return str;
                }
            }
        }
    }
4

2 に答える 2

2

「多すぎる」 using ステートメントを使用することはできません。

Usingusingは単にIDisposableリソースのスコープを作成し、そのスコープを離れたときにIDisposable.Dispose()が呼び出されるようにします。の適切な実装でIDisposable.Dispose()は、オブジェクトが既に破棄されていることを許容する必要があるため、余分なDispose()呼び出しがパターンの適切な実装に影響を与えることはありません。

リーダーは破棄されると閉じられるため、への呼び出しreader.Close()は厳密には必要ありません。

投稿されたコードに明らかなメモリ リークの原因は見当たりません。Visual Studio に含まれているようなメモリ プロファイラーを使用して、実際の原因を切り分けてみてください。

于 2013-05-24T16:25:09.150 に答える
1

using最後のステートメントの後の中括弧のみが必要です。

using (WebResponse response = request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
    str = reader.ReadToEnd();
    return str;
}

それ以外の場合、コードは問題ないように見えます。

于 2013-05-24T16:24:57.300 に答える