关闭流的好处

时间:2014-02-26 11:18:29

标签: c# stream

用户关闭流的观点有什么好处?

运行此代码时,无论您是否注释掉response.Close();,它都不会对用户产生明显的影响。

任何人都可以给我一个不关闭流/文件句柄等的例子会给用户带来明显的问题吗?

    WebRequest request = WebRequest.Create("http://www.microsoft.com");
    WebResponse response = request.GetResponse();
    StreamReader responseStream = new StreamReader(response.GetResponseStream());
    string responseText = responseStream.ReadToEnd();
    Console.WriteLine(responseText); // Displays the HTML of the website
    response.Close();

编辑: 每个人都在说“管理/关闭流,以便释放非托管资源”。但是,任何人都可以向我提供一个示例,说明如何为最终用户创造明显的差异吗?

3 个答案:

答案 0 :(得分:4)

使用它们时关闭/处理所有流非常重要 最好的方法是使用using statement

using(StreamReader responseStream = new StreamReader(response.GetResponseStream())
{
    //streamreader will be disposed automatically,
    //when done executing within brackets.
}

如果未正确关闭/处理流,则会导致内存泄漏。 流关闭/处理流时将释放流使用的资源。

  

每个人都在说“这样处理/关闭流是件好事   你发布了非托管资源“。但任何人都可以提供给我一个   示例显示了如何在结束时产生明显的差异   用户?

在您的应用程序中尝试以下代码:

private void LoopUndisposedStream()
{
    for(int i = 0; i < 5000000; i++)
    {
       CreateUndisposedStream();
    }
}

private void CreateUndisposedStream()
{
    WebRequest request = WebRequest.Create("http://www.microsoft.com");
    WebResponse response = request.GetResponse();
    StreamReader responseStream = new StreamReader(response.GetResponseStream());
    string responseText = responseStream.ReadToEnd();
    Console.WriteLine(responseText); // Displays the HTML of the website
}

以上代码是什么,你绝对不应该这样做。但是,因为您要求一个示例,显示性能问题,而不是处理每个流。在这里。

答案 1 :(得分:4)

通过关闭流,您可以释放与其绑定的资源,尽管这些资源可能会根据您使用的流类型而有所不同,其中一些资源会对其他资源产生更大的影响。

FileStream为例。当流打开时,它在文件上有一个打开的句柄。如果您不关闭它,则在将来某个未指定的点对象被垃圾收集之前,不会释放句柄。

现在,根据您打开该文件的方式,您可能会遇到问题,例如:

FileStream file = new FileStream("example.dat",FileMode.Open,FileAccess.Read,FileShare.None);

这将获取不会释放的文件的独占锁定。这意味着打开文件和读取的任何其他调用都将失败。

所以它总是更好,尤其是在处理与非托管资源交互的类时,一旦完成就会释放。

最简单的方法之一是使用using构造,例如:

using (FileStream file = new FileStream("example.dat",FileMode.Open,FileAccess.Read,FileShare.None)) {
    // Do something useful
}

您可以将using与任何实现IDisposable的类一起使用,它将确保一旦调用语句Dispose的范围之外并释放任何资源。

答案 2 :(得分:1)

通过关闭Stream释放资源,您还可以制作一些不再需要GargabeCollector资格的对象,以减少内存使用量等。