Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有单独写入和读取位置的流_C#_Stream - Fatal编程技术网

C# 具有单独写入和读取位置的流

C# 具有单独写入和读取位置的流,c#,stream,C#,Stream,我想在一台PC上模拟网络类型的流 我通过创建一个流来实现这一点,它接收两个底层流,一个用于读取,另一个用于写入 然后,我创建了这个类的两个实例来交换这两个流。目前,我使用MemoryStreams作为两个底层流 我现在遇到的问题是,如果我将X字节写入内存流,那么它的位置将是X,如果我随后执行读取,我将得不到任何数据,因为我在流的末尾 考虑到我通常会进行几次读/写操作(因此不能在每次写操作后将position重置为0)我可以使用什么Stream来获得这种行为? 实际上,我需要一种字节队列,可以以流

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

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

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

我现在遇到的问题是,如果我将X字节写入
内存流
,那么它的位置将是X,如果我随后执行
读取
,我将得不到任何数据,因为我在流的末尾

考虑到我通常会进行几次读/写操作(因此不能在每次写操作后将position重置为0)我可以使用什么
Stream
来获得这种行为?

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

i、 e.(忽略实际的方法参数)


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

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;
    }
}

唯一的问题是这段代码不是线程安全的。如果您将此代码与多个线程一起使用,则需要确保没有任何东西试图同时调用读和写。在读写方法之上,您可以添加[MethodImpl(MethodImplOptions.Synchronized)]以实现(线程)安全。
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;
    }
}