使用带有C#Foreach.Parallel的robocopy

使用带有C#Foreach.Parallel的robocopy,c#,multithreading,robocopy,C#,Multithreading,Robocopy,我有关于Datatable中多个位置的源目录和目标目录的信息 我使用foreach parallel遍历datatable,然后执行两个任务, 将文件复制到dest并在dest上重命名复制的文件 在这样做的时候,有时我会犯这样的错误, 访问源目录时出现错误32(0x00000020)。进程无法访问该文件,因为其他进程正在使用该文件。 , 访问目标目录时出现错误32(0x00000020)。进程无法访问该文件,因为另一个进程正在使用该文件。 在重命名时,我得到的错误是 重命名文件时出错,进程无法

我有关于Datatable中多个位置的源目录和目标目录的信息

我使用foreach parallel遍历datatable,然后执行两个任务, 将文件复制到dest并在dest上重命名复制的文件

在这样做的时候,有时我会犯这样的错误,
访问源目录时出现错误32(0x00000020)。进程无法访问该文件,因为其他进程正在使用该文件。 ,

访问目标目录时出现错误32(0x00000020)。进程无法访问该文件,因为另一个进程正在使用该文件。

在重命名时,我得到的错误是 重命名文件时出错,进程无法访问该文件,因为另一进程正在使用该文件。

例如

var options=new ParallelOptions()
{
MaxDegreeOfParallelism=4
};
Parallel.foreach(datatableObj.AsEnumerable(),选项,行=>{
字符串sourcePath=row.Field(“source_path”);
字符串destPath=row.Field(“dest_path”);
string searchPattern=row.Field(“搜索模式”);
List files=Directory.GetFiles(sourcePath,searchPattern);
字符串ROBOCOPY_STATIC_ARGUMENTS=@“/MT:32/BYTES/COPY:DAT/NP/R:3/W:1”;
foreach(文件中的字符串文件)
{
复制使用ROBOCOPY(文件、DestPath、ROBOCOPY\u静态参数);
重命名文件(文件,NewFileName+datetimewithmillizes.ext);
}
});
两个线程以并行方式执行,但单线程执行是顺序的,即先复制,然后重命名文件。所以我不明白为什么我会犯上面提到的错误


注意:所有

的目标路径都相同,
NewFileName
设置在哪里?看起来您试图将每个文件重命名为相同的名称,因为
NewFileName
似乎没有更改。如果它是在
copyingRoboCopy
中设置的,那么每次一个线程更改它时,其他线程也会得到更改并尝试将其重命名为相同的名称。在这种情况下,
CopyUsingRoboCopy
应返回新的文件名。每个文件都被重命名为不同的名称,因为其中有时间戳:),但复制速度非常快,可能会在同一秒内复制多个文件,因此仍然获得相同的名称。对于不完整的信息,我们深表歉意。时间戳一直到毫秒,每个文件都是uqniue。为什么要使用
Parallel.ForEach
?对于初学者来说,Robocopy已经可以通过
/mt
开关使用多线程执行操作。其次,它作为一个单独的进程运行。您可以使用
Process在一个循环中启动100个实例。如果需要,可以启动
,然后等待
Process
对象完成<代码>并行。ForEach
仅用于数据并行,这里没有数据
   var options = new ParallelOptions()
                {
                    MaxDegreeOfParallelism = 4
                };
    Parallel.foreach(datatableObj.AsEnumerable(), options, row =>{

    string sourcePath = row.Field<string>("source_path");
    string destPath = row.Field<string>("dest_path");
    string searchPattern = row.Field<string>("Search_pattern");

    List<string> files=Directory.GetFiles(sourcePath, searchPattern);
    string ROBOCOPY_STATIC_ARGUMENTS = @"/MT:32 /BYTES /COPY:DAT /NP /R:3 /W:1";
    foreach(string file in fIles)
    {
          CopyUsingRoboCopy(file,DestPath,ROBOCOPY_STATIC_ARGUMENTS);
          RenameFile(file,NewFileName+datetimewithmilliseconds.ext);
    }

});