【问题标题】:Understanding Streams and their lifetime (Flush, Dispose, Close)了解 Streams 及其生命周期(Flush、Dispose、Close)
【发布时间】:2010-12-24 06:52:57
【问题描述】:

注意:我已经阅读了以下两个问题:

Can you explain the concept of streams?

C# using streams

我正在用 C# 编写代码

  1. 在几乎所有使用流的代码示例中,几乎总是调用 .Dispose()、.Flush()、.Close()。
    • 在流​​的概念中,它完成了什么?
    • 如果我不释放存储在变量中的流,我的应用程序是否在某处泄漏?
    • 为什么我需要调用这些函数?我见过不这样做但仍能完成工作的代码示例(没有明显损坏)

我目前正在我的应用程序中构建一个类,该类包含一个通过myWebRequest.GetResponse().GetResponseStream() 返回流的主要方法(我们称之为GetStream()

主要方法GetStream() 返回一个Stream 对象,该对象可用于任何需要流的操作(StreamReader、Bitmap() 等)。

有没有办法让流在最后一次使用后自动处理(垃圾收集?)而不强制任何调用 .GetStream() 的人手动处理它?

如您所知,我的问题含糊笼统。我对流的理解并不扎实,因此,如果提供比 SO 问题更深入地了解流的有用文章的链接,我们将不胜感激。

【问题讨论】:

    标签: c# stream dispose flush


    【解决方案1】:

    释放流会关闭它(并且可能不会做太多其他事情。)关闭流会刷新它,并释放与流相关的任何资源,例如文件句柄。刷新流获取尚未写入的任何缓冲数据,并立即将其写出;一些流在内部使用缓冲来避免对相对昂贵的资源(如磁盘文件或网络管道)进行大量小更新。

    您需要在大多数流上调用CloseDispose,否则您的代码不正确,因为在垃圾收集器到来之前,底层资源不会被释放供其他人使用(谁知道那需要多长时间)会接受的。)Dispose 当然是首选;预计您将在 C# 中处理所有一次性的东西。在大多数情况下,您可能不必显式调用 Flush

    在 C# 中,通过 using 块调用 Dispose 是惯用的,这是在 finally 中处理的 try-finally 块的语法糖,例如:

    using (FileStream stream = new FileStream(path))
    {
        // ...
    }
    

    在功能上与

    相同
    FileStream stream;
    
    try
    {
        stream = new FileStream(path);
        // ...
    }
    finally
    {
        if (stream != null)
            stream.Dispose();
    }
    

    【讨论】:

    • 最后应该是:`if (stream is IDisposable) ((IDisposable) stream).Dispose();
    • 在未知的 IDisposable 变量上使用“使用”是编译器错误。但是从技术上讲,它应该是: if (stream != null) stream.Dispose();
    • 在许多情况下,显式关闭流是个好主意,即使有人也调用了Dispose。关闭流可能需要执行无法保证成功的操作; Close 的实现通常会在此类问题发生时抛出异常,而某些 Dispose 实现可能会扼杀此类异常(吞下此类异常是邪恶的,但允许它们传播到 Dispose 之外通常会破坏先前的异常,这也是邪恶的;对于哪个邪恶被认为是较小的,实现不同)。
    • A using 块直接利用 IDisposable 接口,在范围退出时调用 Dispose() 方法:msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 2021-01-03
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多