MemoryStream have one thread write to it and another read MemoryStream have one thread write to it and another read multithreading multithreading

MemoryStream have one thread write to it and another read


You can't use a Stream with seeking capabilities from 2 threads simultaneous since a Stream is state full. e.g. A NetworkStream has 2 channels, one for reading and one for writing and therefore can't support seeking.

If you need seeking capabilities, you need to create 2 streams, one for reading and one for writing respectively. Else you can simply create a new Stream type which allows reading and writing from a underlying memory stream by taking exclusive access to the underlying stream and restore its write/read position. A primitive example of that would be:

class ProducerConsumerStream : Stream{    private readonly MemoryStream innerStream;    private long readPosition;    private long writePosition;    public ProducerConsumerStream()    {        innerStream = new MemoryStream();    }    public override bool CanRead { get { return true;  } }    public override bool CanSeek { get { return false; } }    public override bool CanWrite { get { return true; } }    public override void Flush()    {        lock (innerStream)        {            innerStream.Flush();        }    }    public override long Length    {        get         {            lock (innerStream)            {                return innerStream.Length;            }        }    }    public override long Position    {        get { throw new NotSupportedException(); }        set { throw new NotSupportedException(); }    }    public override int Read(byte[] buffer, int offset, int count)    {        lock (innerStream)        {            innerStream.Position = readPosition;            int red = innerStream.Read(buffer, offset, count);            readPosition = innerStream.Position;            return red;        }    }    public override long Seek(long offset, SeekOrigin origin)    {        throw new NotSupportedException();    }    public override void SetLength(long value)    {        throw new NotImplementedException();    }    public override void Write(byte[] buffer, int offset, int count)    {        lock (innerStream)        {            innerStream.Position = writePosition;            innerStream.Write(buffer, offset, count);            writePosition = innerStream.Position;        }    }}