public async Task BufferRemainingData()
{
//ignore if all data has been read
if(_unreadFromStream <= 0)
return;
//new buffer size
int newSize = _remainingInBuffer + _unreadFromStream;
//allocate new buffer if necessary
byte[] newBuffer = newSize > _buffer.Length ? MemoryPool.Instance.Take(newSize) : _buffer;
//copy/move existing buffer data
if(_remainingInBuffer > 0)
Buffer.BlockCopy(_buffer, _position, newBuffer, 0, _remainingInBuffer);
//set read position to start of buffer
_position = 0;
//replace existing buffer
if(_buffer != newBuffer)
{
byte[] temp = _buffer;
_buffer = newBuffer;
//return previous buffer to pool
MemoryPool.Instance.Return(temp);
}
//load all remaining frame data
while(_unreadFromStream > 0)
{
var readTask = ReadAsync(newBuffer, _remainingInBuffer, newSize - _remainingInBuffer);
_remainingInBuffer += await readTask.AutoConfigureAwait();
}
}