从用户的角度来看,关闭流有什么好处?
当运行此代码时,无论是否注释掉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();
编辑:每个人都在说"处理/关闭流这样就可以释放非托管资源"之类的话。但是,有人能为我提供一个例子,说明这如何给最终用户带来显著的差异吗?
通过关闭流,您可以释放与之绑定的资源,尽管这些资源可能因您使用的流的类型而异,其中一些资源的影响比其他资源更大。
以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
并释放任何资源。
使用所有流时,关闭/处置这些流非常重要
最好的方法是使用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
}
上面的代码就是你绝对不应该做的。但既然你要的是一个例子,显示了性能问题,而不是处理每个流。给你。
通过关闭Stream
,您可以释放资源,此外,您还可以使一些不再需要的对象符合GargabeCollector的条件,从而减少内存使用等。