void PreLoad(int count) { var remainInBuffer = (int)(_mem.Length - _mem.Position); var buffer = _buffer; if (remainInBuffer > 0) { Array.Copy(buffer, _mem.Position, buffer, 0, remainInBuffer); } _mem.SetLength(remainInBuffer); _mem.Seek(remainInBuffer, SeekOrigin.Begin); var downloadFrom = _position + remainInBuffer; var availableInStream = _max - downloadFrom; var bufferSize = _buffer.Length; var download = Math.Min(bufferSize - remainInBuffer, availableInStream); if (count > (remainInBuffer + download)) { var message = string.Format( "Buffer is too small. Cached {0}, requested {1}, cap {2}", remainInBuffer, count, _buffer.Length); throw new InvalidOperationException(message); } _reader.DownloadRangeToStream(_mem, downloadFrom, (int)download); _mem.Seek(0, SeekOrigin.Begin); }