我的根本问题是,当using
在StreamWriter
上调用Dispose
时,它也会处理BaseStream
(Close
也有同样的问题)。
我有一个解决方法,但正如您所看到的,它涉及到复制流。有没有办法在不复制流的情况下做到这一点?
这样做的目的是将字符串(最初从数据库中读取)的内容放入流中,以便第三方组件可以读取该流。
NB:我无法更改第三方组件。
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;
}
用作
public void Noddy()
{
System.IO.Stream myStream = CreateStream("The contents of this string are unimportant");
My3rdPartyComponent.ReadFromStream(myStream);
}
理想情况下,我正在寻找一种名为BreakAssociationWithBaseStream
的虚构方法,例如
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;
}
发布于 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中有一个实现。发布于 2013-02-19 21:25:45
.NET 4.5有一个新的方法来解决这个问题:
StreamWriter(Stream, Encoding, Int32, Boolean)
public StreamWriter(
Stream stream,
Encoding encoding,
int bufferSize,
bool leaveOpen
)
发布于 2010-04-19 19:19:23
只是不要在StreamWriter
上调用Dispose
。此类可释放的原因不是因为它持有非托管资源,而是为了允许处置本身可能持有非托管资源的流。如果基础流的生命周期在其他地方处理,则不需要处理编写器。
https://stackoverflow.com/questions/2666888
复制相似问题