我有以下代码用于将文件夹从本地存储上传到 blob 存储,在 blob 的名称中包括文件夹名称本身(该代码基于此处找到的一些方法http://blog.smarx.com/posts/pivot-odata -and-windows-azure-visual-netflix-browsing):
public static void UploadBlobDir(CloudBlobContainer container, string dirPath)
{
string dirName = new Uri(dirPath).Segments.Last();
Parallel.ForEach(enumerateDirectoryRecursive(dirPath), file =>
{
string blobName = Path.Combine(dirName, Path.GetFullPath(file)).Substring(dirPath.Length - dirName.Length);
container.GetBlobReference(blobName).UploadFile(file);
});
}
和 :
private static IEnumerable<string> enumerateDirectoryRecursive(string root)
{
foreach (var file in Directory.GetFiles(root))
yield return file;
foreach (var subdir in Directory.GetDirectories(root))
foreach (var file in enumerateDirectoryRecursive(subdir))
yield return file;
}
此代码按预期工作并上传文件夹,但需要花费大量时间才能完成 -上传 25 个文件需要 20 秒,每个文件 40KB~。所以我厌倦了用普通循环替换并行循环,如下所示:
foreach (var file in enumerateDirectoryRecursive(i_DirPath))
{
string blobName = Path.Combine(dirName, Path.GetFullPath(file)).Substring(i_DirPath.Length - dirName.Length);
container.GetBlobReference(blobName).UploadFile(file);
}
现在上传立即完成(大约3 秒)。
同样重要的是要注意我正在使用存储模拟器进行开发。
Parallel.Forech 显然应该更快。这种差异是来自存储模拟器的限制(并且在上线时,Parallel 会更快)还是我可能做错了什么?