Я пытаюсь создать каталог и скопировать файл (pdf) внутри Parallel.ForEach
.
Ниже приведен простой пример:
private static void CreateFolderAndCopyFile(int index)
{
const string sourcePdfPath = "c:\\testdata\\test.pdf";
const string rootPath = "c:\\testdata";
string folderDirName = string.Format("Data{0}", string.Format("{0:00000000}", index));
string folderDirPath = rootPath + @"\" + folderDirName;
Directory.CreateDirectory(folderDirPath);
string desPdfPath = folderDirPath + @"\" + "test.pdf";
File.Copy(sourcePdfPath, desPdfPath, true);
}
Приведенный выше метод создает новую папку и копирует файл PDF в новую папку.
Создает это дерево каталогов:
TESTDATA
-Data00000000
-test.pdf
-Data00000001
-test.pdf
....
-Data0000000N
-test.pdf
Я пытался вызвать метод CreateFolderAndCopyFile
в цикле Parallel.ForEach
.
private static void Func<T>(IEnumerable<T> docs)
{
int index = 0;
Parallel.ForEach(docs, doc =>
{
CreateFolderAndCopyFile(index);
index++;
});
}
Когда я запускаю этот код, он заканчивается следующей ошибкой:
Процесс не может получить доступ к файлу 'c: \ testdata \ Data00001102 \ test.pdf'
потому что он используется другим процессом.
Но сначала он создал 1111 новых папок и скопировал test.pdf примерно 1111 раз, прежде чем я получил эту ошибку.
Что вызвало такое поведение и как его можно устранить?
РЕДАКТИРОВАНИЕ:
Код выше был образцом игрушки, извините за жестко закодированные строки
Вывод: параллельный метод медленный.
Завтра я попробую несколько методов из Как написать сверхбыстрый код потоковой передачи файлов на C #? .
особенно: http://designingefficientsoftware.wordpress.com/2011/03/03/efficient-file-io-from-csharp/