用户关闭流的观点有什么好处?
运行此代码时,无论您是否注释掉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();
编辑: 每个人都在说“管理/关闭流,以便释放非托管资源”。但是,任何人都可以向我提供一个示例,说明如何为最终用户创造明显的差异吗?
答案 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资格的对象,以减少内存使用量等。