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