У меня есть следующий код для загрузки формы папки локальное хранилище в хранилище 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;
}
Этот код работает и загружает папку, как и предполагалось, но для ее завершения требуется очень много времени - требуется 20 секунд для загрузки 25 файлов по 40 КБ ~ каждый. Поэтому я устал заменять параллельный цикл на обычный, например:
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 будет быстрее) или же я могу ошибаться?