public override int Read(byte[] buffer, int offset, int count) { _pipe.RaiseOnRead(count); var remainingCount = count; while (remainingCount > 0) { if (_currentData == null) { _currentData = _pipe.ReceiveSync(); _currentDataPos = 0; if (_currentData == null) { break; // No more bytes will be available. Finished. } } var remainingBufferSize = _currentData.WrittenLength - _currentDataPos; var readCount = remainingCount > remainingBufferSize ? remainingBufferSize : remainingCount; _currentData.Read(_currentDataPos, buffer, offset, readCount); _currentDataPos += readCount; if (_currentData.WrittenLength == _currentDataPos) { _currentData = null; _currentDataPos = 0; } offset += readCount; remainingCount -= readCount; } var bytesRead = count - remainingCount; _position += bytesRead; return(bytesRead); }