protected byte[] Bread(int length) { ThrowIfEnded(); byte[] data; if (Buffered < length) { BwaitIndex = BreadIndex + length; Bwait.WaitOne(); if (Ended) { return(null); } Bwait.Reset(); BwaitIndex = -1; } lock (BreadLock) { data = new byte[length]; lock (BwriteLock) { Bstream.Position = BreadIndex; Bstream.Read(data, 0, length); BreadIndex += length; } } Btrim(); return(data); }
protected void Bwrite(byte[] data) { ThrowIfEnded(); lock (BwriteLock) { Bstream.Position = BwriteIndex; Bstream.Write(data, 0, data.Length); BwriteIndex += data.Length; if (BreadIndex != -1 && BwriteIndex >= BreadIndex) { Bwait.Set(); } } }
virtual public void End() { ThrowIfEnded(); lock (BreadLock) { lock (BwriteLock) { Ended = true; Bstream.Dispose(); Bblock.Set(); Bwait.Set(); Bblock.Dispose(); Bwait.Dispose(); PipedTo = null; Paused = false; } } }