Получение прогресса CloudBlob.DownloadToFileParallelAsync
Я пытаюсь загрузить двоичные файлы из своей учетной записи хранения 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, чтобы разбить большой двоичный объект на более мелкие части и объединить их на стороне клиента. Эффективно работает с чанками по 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;
}
}