首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MemoryStream有一个线程写入它,另一个线程读取

MemoryStream有一个线程写入它,另一个线程读取
EN

Stack Overflow用户
提问于 2012-09-08 05:20:58
回答 1查看 9K关注 0票数 19

这是我如何写入一个流,然后使用一个线程从它读取:

代码语言:javascript
复制
        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);

现在我想知道是否可以从一个线程写入内存流,然后从一个单独的线程读取该流.。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-08 05:34:34

您不能使用流同时从2个线程寻找功能,因为一个流是满的。例如,NetworkStream有两个渠道,一个用于阅读,一个用于写作,因此不能支持寻找。

如果需要查找功能,则需要创建2个流,一个用于阅读,另一个用于写入。否则,您可以简单地创建一个新的Stream类型,通过独占访问底层流并恢复其写/读位置,从而允许从底层内存流中读取和写入。这方面的一个原始例子是:

代码语言:javascript
复制
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;
        }
    }
}
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12328245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档