如何解决处置FileStream和BinaryReader
| 我有一个管理对二进制文件的访问的类。我想在第一次请求时打开此文件,然后将其保持打开状态,直到处理完我的课程实例为止。我已经这样实现了: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
}
}
}
问题:
调用ѭ2是否足够,还是必须显式处理FileStream?
如果我也需要处理FileStream,我可以这样修改ѭ3like方法:
public void dispose()
{
if (_reader != null)
{
if (_reader.BaseStream != null)
_reader.BaseStream.dispose();
_reader.dispose();
// Does the order of disposing matter here ?
}
}
还是我需要将ѭ5保留在单独的类变量private FileStream _stream
中并在以后处理此流?
解决方法
处置_reader就足够了。
但这是由于读者独特的“功能”,它假定了流的所有权。
因此,作为2个相关或不相关的Disposables的一般模式,它不会这样做。因此,为了安全和一致,我将Stream存储为_stream并最终将其处置。它当然不会受伤。
,处置阅读器将自动处置基础流,因此您无需显式进行处理。
,BinaryReader.Dispose和StreamReader.Dispose的当前实现始终强制将基础流进行Dispose / Closed。没有解决方法。
但:
Microsoft团队计划在下一版.NET中修复此问题。
http://connect.microsoft.com/VisualStudio/feedback/details/361389/allow-binaryreader-and-streamreader-to-wrap-a-stream-without-disposed-it
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。