取得 CloudBlob.DownloadToFileParallelAsync 的进展
Getting progress of CloudBlob.DownloadToFileParallelAsync
我正在尝试从我的 Azure 存储帐户下载二进制文件。最初,我使用的是 CloudBlob.DownloadToFileAsync(),它允许我提供一个 IProgress 参数并获取传输的进度更新。
但是,对于大于 2gb 的文件,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);
已通过变通办法解决。我没有使用 DownloadToFileAsync,而是使用 DownloadRangeToStreamAsync 将 blob 分成更小的部分,然后在客户端将它们组合起来。有效处理 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;
}
}
我正在尝试从我的 Azure 存储帐户下载二进制文件。最初,我使用的是 CloudBlob.DownloadToFileAsync(),它允许我提供一个 IProgress 参数并获取传输的进度更新。
但是,对于大于 2gb 的文件,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);
已通过变通办法解决。我没有使用 DownloadToFileAsync,而是使用 DownloadRangeToStreamAsync 将 blob 分成更小的部分,然后在客户端将它们组合起来。有效处理 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;
}
}