【问题标题】:Stream that has separate write and read positions具有单独写入和读取位置的流
【发布时间】:2012-05-08 07:35:35
【问题描述】:

我想在单台 PC 上模拟网络类型的流。

我通过创建一个Stream 来实现这一点,该Stream 接收两个底层流,一个用于读取,另一个用于写入。

然后我创建这个类的 2 个实例来交换 2 个流。目前我使用MemoryStreams 作为两个底层流。

我现在遇到的问题是,如果我将 X 字节写入 MemoryStream,那么它的位置将是 X,如果我再执行 Read,我将没有数据,因为我在流的末尾.

鉴于我通常会进行几次读取/写入(因此不能在每次写入后将位置重置为 0)我可以使用什么 Stream 来获得这种行为?

实际上我想要一种字节队列,我可以以流的形式写入和读取。

即(忽略实际的方法参数)

MyStream.Write({ 1, 2, 3, 4, 5, 6 });
MyStream.Write({ 7, 8 });
MyStream.Read(3) // Returns { 1, 2, 3 }
MyStream.Read(4) // Returns { 4, 5, 6, 7 }

【问题讨论】:

    标签: c# stream


    【解决方案1】:

    它实际上比我想象的要简单得多(无论如何,就我而言)。
    我只是在执行任何操作之前恢复/记录读/写位置:

    public class QueueStream : MemoryStream
    {
        long ReadPosition;
        long WritePosition;
    
        public QueueStream() : base() { }
    
        public override int Read(byte[] buffer, int offset, int count)
        {
            Position = ReadPosition;
    
            var temp = base.Read(buffer, offset, count);
    
            ReadPosition = Position;
    
            return temp;
        }
    
        public override void Write(byte[] buffer, int offset, int count)
        {
            Position = WritePosition;
    
            base.Write(buffer, offset, count);
    
            WritePosition = Position;
        }
    }
    

    【讨论】:

    • 唯一的问题是这段代码不是线程安全的。如果您将此代码用于多个线程,您需要确保没有任何尝试同时调用 read 和 write。在 Read 和 Write 方法之上,您可以添加 [MethodImpl(MethodImplOptions.Synchronized)] 以确保(线程)安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多