public async Task CopyFromSourceToDestination() { _deflateStream.IncrementAsyncOperations(); 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) { if (bytesRead > _arrayPoolBufferHighWaterMark) { _arrayPoolBufferHighWaterMark = bytesRead; } await _destination.WriteAsync(_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.DecrementAsyncOperations(); Array.Clear(_arrayPoolBuffer, 0, _arrayPoolBufferHighWaterMark); // clear only the most we used ArrayPool <byte> .Shared.Return(_arrayPoolBuffer, clearArray : false); _arrayPoolBuffer = null; } }