На диске создается и блокируется целевой файл (во избежание изменений в процессе работы).
Файл-источник блокируется (во избежание изменений в процессе работы) и «раскраивается» на кусочки, которые в дальнейшем будут обработаны в асинхронном режиме. Процесс раскройки происходит в синхронном режиме. Информация о «наметке» сохраняется в виде коллекции структур. Наметка не содержит никакой информации помимо начала фрагмента и его длины.
Для режима сжатия все просто — все кусочки одинаковой длинны (за исключением разве что последнего). Значение можно передать 4 параметром в приложение.
Для режима распаковки все несколько сложнее. Приходиться сканировать файл-источник в поисках магических чисел, свойственных gzip формату. Мало того, что это не быстро так еще и не обладает 100процентной надежностью.
После завершения процесса раскройки кусочки обрабатываются в асинхронном режиме. Количество потоков вычисляется исходя из кол-ва доступных процессоров.
Каждый поток фетчит наметки из коллекции, обрабатывает его (загружая фрагмент файла-источника в память) согласно указанному режиму работы и преобразовывая в экземпляр специального класса переносит в соответствующую коллекцию. Результат работы сохраняется на диск в виде файла. Экземпляр же класса выступает лишь в роли указателя на этот файл. Файлы заблокированы от изменений на время работы метода.
После обработки последнего кусочка все они склеиваются в единый файл-результат. Слияние происходит в синхронном режиме. Тут присутствует главная дыра в производительности. Т.к. удаление связанных с кусочками файлов происходит в синхронном режиме.
Оповещаются подписчики события завершения работы асинхронного метода.