微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

处置FileStream和BinaryReader

如何解决处置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 举报,一经查实,本站将立刻删除。