在Stream,StreamReader和WebResponse中使用Statement

时间:2013-05-24 16:22:23

标签: c# memory-leaks io httpwebrequest using

我一直在注意到我的某些服务中的内存泄漏,我正在努力确保我正确处理资源。我有以下代码用于发送外部Http请求。我不确定我是否遗漏了任何内容,或者是否有太多使用语句。

        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;
                }
            }
        }
    }

2 个答案:

答案 0 :(得分:2)

使用语句不能“太多”。

使用using只会为IDisposable资源创建一个范围,以便在它离开该范围时调用IDisposable.Dispose()IDisposable.Dispose()的良好实现应该容忍已经处理的对象,因此额外的Dispose()调用不会影响模式的正确实现。

您对reader.Close()的致电并非绝对必要,因为读者在处理时将被关闭。

我没有在发布的代码中看到任何明显的内存泄漏源。尝试使用Visual Studio中包含的内存分析器来隔离实际原因。

答案 1 :(得分:1)

在最后using语句后,您只需要花括号。

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

否则你的代码看起来没问题。