c# – 专用于字节流的FIFO /队列缓冲区

是否有任何.NET数据结构/类的组合允许将字节数据附加到缓冲区的末尾,但是所有的窥视和读取都是从一开始就缩短了读取时的缓冲区?

MemoryStream类似乎是这样做的一部分,但是我需要维护单独的读取和写入位置,并且在读取数据之后它不会自动丢弃数据.

一个答案已经发布在this question的回复,这基本上是我想要做的,但我更喜欢我可以在同一个进程的不同组件中进行异步I / O的操作,就像普通的管道甚至网络流(我需要先过滤/处理数据).

我会发布一份我在工作中为一个项目写的一些逻辑的被删除的副本.该版本的优点是它可以使用缓冲数据的链接列表,因此您不必在读取时缓存大量内存和/或复制内存.此外,其线程安全并且像网络流一样,即:当没有数据可用时读取:等待直到有数据可用或超时.另外,当读取x个字节量并且只有y个字节量时,读取所有字节后返回.我希望这有帮助!

    public class SlidingStream : Stream
{
    #region Other stream member implementations

    ...

    #endregion Other stream member implementations

    public SlidingStream()
    {
        ReadTimeout = -1;
    }

    private readonly object _writeSyncRoot = new object();
    private readonly object _readSyncRoot = new object();
    private readonly LinkedList<ArraySegment<byte>> _pendingSegments = new LinkedList<ArraySegment<byte>>();
    private readonly ManualResetEventSlim _dataAvailableResetEvent = new ManualResetEventSlim();

    public int ReadTimeout { get; set; }

    public override int Read(byte[] buffer, int offset, int count)
    {
        if (_dataAvailableResetEvent.Wait(ReadTimeout))
            throw new TimeoutException("No data available");

        lock (_readSyncRoot)
        {
            int currentCount = 0;
            int currentOffset = 0;

            while (currentCount != count)
            {
                ArraySegment<byte> segment = _pendingSegments.First.Value;
                _pendingSegments.RemoveFirst();

                int index = segment.Offset;
                for (; index < segment.Count; index++)
                {
                    if (currentOffset < offset)
                    {
                        currentOffset++;
                    }
                    else
                    {
                        buffer[currentCount] = segment.Array[index];
                        currentCount++;
                    }
                }

                if (currentCount == count)
                {
                    if (index < segment.Offset + segment.Count)
                    {
                        _pendingSegments.AddFirst(new ArraySegment<byte>(segment.Array, index, segment.Offset + segment.Count - index));
                    }
                }

                if (_pendingSegments.Count == 0)
                {
                    _dataAvailableResetEvent.Reset();

                    return currentCount;
                }
            }

            return currentCount;
        }
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        lock (_writeSyncRoot)
        {
            byte[] copy = new byte[count];
            Array.Copy(buffer, offset, copy, 0, count);

            _pendingSegments.AddLast(new ArraySegment<byte>(copy));

            _dataAvailableResetEvent.Set();
        }   
    }
}
翻译自:https://stackoverflow.com/questions/8221136/fifo-queue-buffer-specialising-in-byte-streams

转载注明原文:c# – 专用于字节流的FIFO /队列缓冲区