#azure #azure-blob-storage #iprogress
#azure #azure-blob-хранилище #iprogress
Вопрос:
Я пытаюсь загрузить двоичные файлы из моей учетной записи хранилища Azure. Изначально я использовал CloudBlob.DownloadToFileAsync(), который позволил мне указать параметр IProgress и получать обновления о ходе передачи.
Однако для файлов размером более 2 ГБ DownloadToFileAsync зависал. Согласно документации, мне нужно было использовать DownloadToFileParallelAsync для загрузки файлов большего размера. Я реализовал это и подтвердил, что теперь это работает, но теперь я не могу получить ход загрузки, поскольку он не предлагает параметр IProgress.
Может кто-нибудь указать мне, как я могу собрать какие-либо полезные данные о ходе выполнения или предложить обходной путь?
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;
}
}