Estoy tratando de crear un directorio y copiar un archivo (pdf) dentro de un Parallel.ForEach
.File.Copy en Parallel.ForEach
A continuación se muestra un ejemplo sencillo:
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);
}
El método anterior crea una nueva carpeta y copia el archivo PDF en una nueva carpeta. Se crea este árbol dir:
TESTDATA
-Data00000000
-test.pdf
-Data00000001
-test.pdf
....
-Data0000000N
-test.pdf
Traté de llamar al método CreateFolderAndCopyFile
en un bucle Parallel.ForEach
.
private static void Func<T>(IEnumerable<T> docs)
{
int index = 0;
Parallel.ForEach(docs, doc =>
{
CreateFolderAndCopyFile(index);
index++;
});
}
Cuando ejecuto el código termina con el siguiente error:
The process cannot access the file 'c:\testdata\Data00001102\test.pdf' because it is being used by another process.
Pero primero creado 1111 nuevas carpetas y copié test.pdf aproximadamente 1111 veces antes de que llegara este error.
¿Qué causó este comportamiento y cómo se puede resolver?
Editado:
Código anterior se muestra de juguete, lo siento por cadenas cifrados duros Conclusión: Método paralelo es lento.
Mañana pruebo algunos métodos de How to write super-fast file-streaming code in C#?.
especialmente: http://designingefficientsoftware.wordpress.com/2011/03/03/efficient-file-io-from-csharp/
Como acotación al margen, que es mejor usar 'Path.Combine' en lugar de la concatenación de la ruta de sí mismo. –
@Mike Noté que aún no ha votado o aceptado una respuesta en el sitio. Te sugiero que leas el [faq] para conocer estos aspectos de la comunidad de Stack Overflow. –