Вопрос по stream, memorystream, multithreading, c# – MemoryStream имеет один поток для записи, а другой для чтения

17

Вот как я пишу в поток, а затем читаю из него, используя 1 поток:

        System.IO.MemoryStream ms = new System.IO.MemoryStream();

        // write to it
        ms.Write(new byte[] { 1, 2, 3, 4, 5, 6, 7 }, 0, 7);

        // go to the begining
        ms.Seek(0, System.IO.SeekOrigin.Begin);

        // now read from it
        byte[] myBuffer = new byte[7];
        ms.Read(myBuffer, 0, 7);

Теперь мне было интересно, можно ли записать поток памяти из одного потока и прочитать этот поток из отдельного потока.

Да многос мест, где они говорят об этом. Я просто буду признателен, если смогу увидеть очень простой пример того, как я смогу это сделать ... Tono Nam
Прочитай этоstackoverflow.com/questions/2825166/... Nikhil Agrawal

Ваш Ответ

1   ответ
15

Вы можете't использовать поток с возможностью одновременного поиска из 2 потоков, поскольку поток заполнен. например NetworkStream имеет 2 канала, один для чтения и один для записи, и поэтому можетпоиск поддержки.

Если вам нужны возможности поиска, вам нужно создать 2 потока: один для чтения и один для записи соответственно. В противном случае вы можете просто создать новый тип потока, который позволяет чтение и запись из основного потока памяти, используя эксклюзивный доступ к базовому потоку и восстанавливая его позицию записи / чтения. Примитивным примером этого будет:

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;
        }
    }
}
Похоже, хорошее решение. armen.shimoon
Работает отлично, спасибо! Как мне реализовать метод поиска? я должен просто переместить?innerStream.Position Tono Nam
@NickWhaley Хороший вопрос, эта реализация не заботится об этом. Производитель более высокого порядка должен сигнализировать потребителю более высокого порядка, когда данные доступны. Не стесняйтесь размещать реализацию, которая делает это для вас Polity
Спасибо, теперь это имеет смысл! Tono Nam

Похожие вопросы