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