首页 > 解决方案 > 为什么任务并行性不会加快上传/下载速度?

问题描述

我编写了一个简单的 C# 控制台应用程序来测量按顺序和并行下载 20 个 Azure blob 文件(每个大约 3mb 的图像)的速度。

我的印象是并行下载文件会明显更快,但根据我的经验,它实际上需要更长的时间。这是并行下载的代码:

    List<Task> tasks = new List<Task>();
    foreach (string blobName in blobNames)
    {
        Task t = Task.Run(() =>
        {
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
            blockBlob.DownloadToFileAsync(blobName, FileMode.Create).Wait();
        });

        tasks.Add(t);
    }

    Task.WaitAll(tasks.ToArray());

我是否接近这个错误,导致不必要的瓶颈或什么?还是我从根本上误解了并行的好处?

标签: c#azureasync-awaittask-parallel-libraryazure-blob-storage

解决方案


IMO,您不应该开始下载每个 blob 的新任务,因为这是 I/O 密集型操作而不是计算密集型操作。使用多个任务会增加管理任务的开销,而您实际上并没有获得任何收益。

将您的代码更改为:

List<Task> tasks = new List<Task>();
foreach (string blobName in blobNames)
{
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
    tasks.Add(blockBlob.DownloadToFileAsync(blobName, FileMode.Create));
}


Task.WaitAll(tasks.ToArray());

这将启动多个异步 I/O 请求,并且在从 Azure blob-storage 下载所有 blob 后,您的代码将继续运行。由于我们没有单独等待每个下载任务,所有下载都同时运行。


推荐阅读