我有一个类来管理对二进制文件的访问。我想在第一次请求时打开这个文件,然后一直打开,直到我的类的实例被释放为止。我是这样执行的:
public class SomeService : IDisposable
{
private BinaryReader _reader;
public int ServiceFunction(...)
{
if (_reader == null)
CreateReader();
// Do something with _reader and return a result
}
private void CreateReader()
{
var stream = new FileStream("myFile", FileMode.Open, FileAccess.Read);
_reader = new BinaryReader(stream);
}
public void Dispose()
{
if (_reader != null)
_reader.Dispose();
}
}然后我会以这种方式使用这个类:
using (var service = new SomeService())
{
foreach (var item in someList)
{
// other stuff
if (eventuallyTrue)
{
int result = service.ServiceFunction(item.SomeProperty);
// other stuff
}
}
}问题:
_reader.Dispose(),或者是否也有必要释放FileStream FileStream --我也需要释放FileStream,我是否可以像这样修改Dispose方法:{ if (_reader != null) { if (_reader.BaseStream != null) _reader.BaseStream.Dispose();_reader.Dispose();//这里的处理顺序是否重要?}
FileStream保存在单独的类变量private FileStream _stream中,并在以后处理该流?发布于 2011-04-29 18:47:16
处理_reader就足够了。
但这是因为读者的一个独特的“特征”,它假定了流的所有权。
因此,作为2种相关或不相关的可处置物的一般模式,它将无法做到。因此,我会将流存储为_stream,并最终将其处理掉,这样才能安全和一致。肯定不会疼的。
发布于 2011-04-29 21:30:22
BinaryReader.Dispose和StreamReader.Dispose的当前实现总是强制处理/关闭底层流。没有解决办法。
但是:
微软团队计划在下一个版本的.NET中修复这个问题。
http://connect.microsoft.com/VisualStudio/feedback/details/361389/allow-binaryreader-and-streamreader-to-wrap-a-stream-without-disposing-it
发布于 2011-04-29 18:42:40
配置读取器将自动释放底层流,因此不需要显式地进行处理。
https://stackoverflow.com/questions/5836001
复制相似问题