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

#azure #azure-blob-storage #iprogress

#azure #azure-blob-хранилище #iprogress

Вопрос:

Я пытаюсь загрузить двоичные файлы из моей учетной записи хранилища 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, чтобы разбить большой двоичный объект на более мелкие части и объединить их на стороне клиента. Эффективно работает с блоками размером 16 МБ.

             //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;

                }
                
               
            }