为什么Task并行性不会加快上传/下载速度?

var*_*ian 2 c# azure task-parallel-library azure-storage-blobs async-await

我编写了一个简单的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());
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*els 7

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());
Run Code Online (Sandbox Code Playgroud)

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