public async Task CopyFromSourceToDestinationAsync() { _deflateStream.AsyncOperationStarting(); try { // Flush any existing data in the inflater to the destination stream. while (true) { 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 { 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; } }