了解Streams及其生命周期(Flush,Dispose,Close)
注意:我已经阅读了以下两个问题:
你能解释一下溪流的概念吗?
C#使用流
我在C#中编码
- 在几乎所有使用流的代码示例中,几乎总是调用.Dispose(),.Flush(),.Close()。
- 在流的概念中,完成了什么?
- 如果我不处理存储在变量中的流,我的应用程序是否泄漏到某处?
- 为什么我需要调用这些函数中的任何一个? 我见过没有这样做的代码示例仍然可以完成工作(没有明显的破损)
我正在我的应用程序中构建一个类,它包含一个主方法(让我们称之为GetStream()
),它通过myWebRequest.GetResponse().GetResponseStream()
返回一个流myWebRequest.GetResponse().GetResponseStream()
主要方法GetStream()
返回一个Stream
对象,该对象可用于需要流的任何操作(StreamReader,Bitmap()等)。
有没有办法让流在最后一次使用后自动处理(垃圾收集?),而不强迫任何人调用.GetStream()
来手动处理它?
你可能会说,我的问题很模糊和笼统。 我对流的理解并不牢固,所以任何链接到有用的文章,提供更深入的视图流,而不是SO问题可以提供。
处理流会关闭它(并且可能没有做太多其他事情。)关闭流将其刷新,并释放与流相关的所有资源,如文件句柄。 刷新流将获取尚未写入的任何缓冲数据,并立即将其写出; 一些流在内部使用缓冲,以避免对相对昂贵的资源(如磁盘文件或网络管道)进行大量的小更新。
您需要在大多数流上调用Close
或Dispose
,或者您的代码不正确,因为在垃圾收集器到来之前,其他人不会释放底层资源(谁知道要花多长时间。) Dispose
is当然是首选的; 预计你将把所有一次性物品丢弃在C#中。 在大多数情况下,您可能不必明确地调用Flush
。
在C#中,通过using
块调用Dispose
是惯用的,这是一个在finally中处理的try-finally块的语法糖,例如:
using (FileStream stream = new FileStream(path)) { // ... }
在function上是相同的
FileStream stream; try { stream = new FileStream(path); // ... } finally { if (stream != null) stream.Dispose(); }