public async Task CopyFromSourceToDestinationAsync() { _deflateStream.AsyncOperationStarting(); try { Debug.Assert(_deflateStream._inflater != null); // Flush any existing data in the inflater to the destination stream. while (!_deflateStream._inflater.Finished()) { int bytesRead = _deflateStream._inflater.Inflate(_arrayPoolBuffer, 0, _arrayPoolBuffer.Length); if (bytesRead > 0) { await _destination.WriteAsync(new ReadOnlyMemory <byte>(_arrayPoolBuffer, 0, bytesRead), _cancellationToken).ConfigureAwait(false); } else if (_deflateStream._inflater.NeedsInput()) { // only break if we read 0 and ran out of input, if input is still available it may be another GZip payload break; } } // Now, use the source stream's CopyToAsync to push directly to our inflater via this helper stream await _deflateStream._stream.CopyToAsync(this, _arrayPoolBuffer.Length, _cancellationToken).ConfigureAwait(false); } finally { _deflateStream.AsyncOperationCompleting(); ArrayPool <byte> .Shared.Return(_arrayPoolBuffer); _arrayPoolBuffer = null !; } }