File.Copy в Parallel.ForEach

Я пытаюсь создать каталог и скопировать файл (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(IEnumerable docs)
    {
        int index = 0;
        Parallel.ForEach(docs, doc =>
                                   {
                                       CreateFolderAndCopyFile(index);
                                       index++;
                                   });
    }

Когда я запускаю этот код, он завершается со следующей ошибкой:

Процесс не может получить доступ к файлу 'c:\testdata\Data00001102\test.pdf' потому что он используется другим процессом.

Но сначала он создал 1111 новых папок и скопировал test.pdf примерно 1111 раз, прежде чем я получил эту ошибку.

Что вызвало такое поведение и как его можно устранить?

EDITED:

Код выше был игрушечным образцом, извините за жестко закодированные строки Вывод: параллельный метод работает медленно.

Завтра я попробую некоторые методы из Как написать сверхбыстрый код для потоковой передачи файлов на C#?.

особенно: http://designingefficientsoftware.wordpress.com/2011/03/03/efficient-file-io-from-csharp/

8
задан burnttoast11 9 March 2018 в 19:31
поделиться