public async Task Process(CancellationToken cancellationToken) { var processorsCount = Environment.ProcessorCount; var channel = Channel.CreateBounded <Task <byte[]> >(processorsCount); var fileParts = _fileSource.ReadByPartsAsync(_partSize); var processing = Task.Run(async() => { var channelWriter = channel.Writer; await foreach (var part in fileParts) { var compressedPartTask = Task.Run(() => { var compressedPart = ProcessPart(part); return(compressedPart); }, cancellationToken); await channelWriter.WriteAsync(compressedPartTask, cancellationToken); } channelWriter.Complete(); }, cancellationToken); await WriteByParts(channel.Reader, cancellationToken); }