Получение прогресса CloudBlob.DownloadToFileParallelAsync

Я пытаюсь загрузить двоичные файлы из своей учетной записи хранения Azure. Первоначально я использовал CloudBlob.DownloadToFileAsync(), который позволял мне указать параметр IProgress и получать обновления о ходе передачи.

Однако в больших файлах > 2 ГБ DownloadToFileAsync зависал. Согласно документации, мне нужно было использовать DownloadToFileParallelAsync для загрузки больших файлов. Я реализовал это и подтверждаю, что теперь это работает, но теперь я не могу получить ход загрузки, поскольку он не предлагает параметр IProgress.

https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.storage.blob.cloudblob.downloadtofileparallelasync?view=azure-dotnet-legacy

Может ли кто-нибудь указать мне, как я могу собрать какие-либо полезные данные о прогрессе или предложить обходной путь?

                  int parallelIOCount = SystemInfo.processorCount;
            long rangeSizeInBytes = 16 * Constants.MB;
            await cloudModuleBlob.DownloadToFileParallelAsync(targetTempModuleFile, FileMode.Create, parallelIOCount, rangeSizeInBytes, cancellationTokenSource.Token);

            progressSlider.value = 1.0f;


            //When the download is finished...
            //Rename the temp file to the full version.
            if (File.Exists(targetCiqModuleFile))
            {
                File.Delete(targetCiqModuleFile);
            }

            File.Move(targetTempModuleFile, targetCiqModuleFile);



            Debug.Log("Download saved to: " + targetCiqModuleFile);

1 ответ

Решил это обходным путем. Вместо использования DownloadToFileAsync я использовал DownloadRangeToStreamAsync, чтобы разбить большой двоичный объект на более мелкие части и объединить их на стороне клиента. Эффективно работает с чанками по 16mb.

                  //Create the file.
            using (FileStream fileStream = File.Create(targetTempModuleFile))
            {

                long chunkSize = 16 * Constants.MB;

                Int64 current = 0;

                while (current < cloudModuleBlob.Properties.Length)
                {


                    if ((current + chunkSize) > cloudModuleBlob.Properties.Length)
                    {
                        await cloudModuleBlob.DownloadRangeToStreamAsync(fileStream, current, (cloudModuleBlob.Properties.Length - current), default, default, default, progressHandler, cancellationToken);
                    }
                    else
                    {
                        await cloudModuleBlob.DownloadRangeToStreamAsync(fileStream, current, chunkSize, default, default, default, progressHandler, cancellationToken);
                    }


                    current = current + chunkSize;

                }
                
               
            }
Другие вопросы по тегам