首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有办法在不关闭BaseStream的情况下关闭StreamWriter?

有没有办法在不关闭BaseStream的情况下关闭StreamWriter?
EN

Stack Overflow用户
提问于 2010-04-19 19:16:22
回答 5查看 45.9K关注 0票数 126

我的根本问题是,当usingStreamWriter上调用Dispose时,它也会处理BaseStream (Close也有同样的问题)。

我有一个解决方法,但正如您所看到的,它涉及到复制流。有没有办法在不复制流的情况下做到这一点?

这样做的目的是将字符串(最初从数据库中读取)的内容放入流中,以便第三方组件可以读取该流。

NB:我无法更改第三方组件。

代码语言:javascript
复制
public System.IO.Stream CreateStream(string value)
{
    var baseStream = new System.IO.MemoryStream();
    var baseCopy = new System.IO.MemoryStream();
    using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))
    {
        writer.Write(value);
        writer.Flush();
        baseStream.WriteTo(baseCopy); 
    }
    baseCopy.Seek(0, System.IO.SeekOrigin.Begin);
    return baseCopy;
}

用作

代码语言:javascript
复制
public void Noddy()
{
    System.IO.Stream myStream = CreateStream("The contents of this string are unimportant");
    My3rdPartyComponent.ReadFromStream(myStream);
}

理想情况下,我正在寻找一种名为BreakAssociationWithBaseStream的虚构方法,例如

代码语言:javascript
复制
public System.IO.Stream CreateStream_Alternate(string value)
{
    var baseStream = new System.IO.MemoryStream();
    using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))
    {
        writer.Write(value);
        writer.Flush();
        writer.BreakAssociationWithBaseStream();
    }
    return baseStream;
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-19 19:19:09

如果您使用的是.NET Framework4.5或更高版本,则有一个StreamWriter overload using which you can ask the base stream to be left open when the writer is closed

在4.5之前的.NET框架的早期版本中,StreamWriter假定它拥有流。选项:

  • 不要丢弃StreamWriter;只需刷新它。
  • 创建一个流包装器,它忽略对Close/Dispose的调用,但代理其他所有内容。如果你想从那里获取它,我在MiscUtil中有一个实现。
票数 129
EN

Stack Overflow用户

发布于 2013-02-19 21:25:45

.NET 4.5有一个新的方法来解决这个问题:

StreamWriter(Stream, Encoding, Int32, Boolean)

代码语言:javascript
复制
public StreamWriter(
    Stream stream,
    Encoding encoding,
    int bufferSize,
    bool leaveOpen
)
票数 47
EN

Stack Overflow用户

发布于 2010-04-19 19:19:23

只是不要在StreamWriter上调用Dispose。此类可释放的原因不是因为它持有非托管资源,而是为了允许处置本身可能持有非托管资源的流。如果基础流的生命周期在其他地方处理,则不需要处理编写器。

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2666888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档