【问题标题】:Pre-created Stream and "using" block预先创建的流和“使用”块
【发布时间】:2012-03-08 04:56:25
【问题描述】:

当“使用”块篡改了我预先创建的对象时,我真的很生气。我有这段代码

class Asset {
    public Stream FileStream { get; set; }

    public Asset(string fileName) {
        FileStream = ...open a file stream...;
    }
}

// Somewhere else
Asset asset = new Asset("file.txt");
using (var reader = new StreamReader(asset.FileStream)) {
    //blah blah blah
}

// Somewhere else else
using (var reader2 = new StreamReader(asset.FileStream))

=> 抛出此异常:

System.ArgumentException:流不可读。

在 Visual Studio 中的逐步调试帮助我知道asset.FileStream 已在第一个“使用”块之后被释放。

请帮我救他的命 :(( 如何从流中创建克隆流?

【问题讨论】:

  • 我认为简单的答案是在你完成之前不要释放流......当你使用 using 块时,它会释放阅读器,然后释放流。

标签: c# stream clone


【解决方案1】:

我同意读者关闭底层流的事实是愚蠢的。 this article 中概述的方法是创建一个包装 Stream 的装饰器类,并且对 CloseDispose 方法有一个空操作。不过,这可能不值得开销,因此您应该考虑不要为这些读者使用using

【讨论】:

  • 或者,如果两个 using 块使用相同的方法,您可以将第二个移动到第一个中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2015-10-21
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多