2013-04-18 38 views
2

我们有我们想要复制一些文件到完整路径的列表,有点像这个Directory.CreateDirectory可以从一个线程访问文件夹,但不能访问其他文件夹吗?

C:\temp\sub1\file1A 
C:\temp\sub1\file1B 
C:\temp\sub2\file2A 
C:\temp\sub3\file3A 
C:\temp\sub3\file3B 
C:\temp\sub3\file3C 
etc.... 

有一些代码,不会这

for each file in the file list 
    if (!Directory.Exists(dirName) 
    { 
     Directory.CreateDirectory(dirName) 
    } 

我们可以从看记录所有子文件夹被创建,并且每个子文件夹只有一次尝试 - 所以在每个子文件夹中的第一个文件已经通过上述循环后,Directory.Exists返回true。

然后代码确实像

var fileDownloadActions = new List<Action>(); 

// populated the list with GetFile(requiredInfo) 

Parallel.Invoke(new ParallelOptions {MaxDegreeOfParallelism = 10}, 
       fileDownloadActions.ToArray()); 

而现在这里是奇数位 - 大多数的这一切正常,但有时它失败与多个DirectoryNotFoundExceptions时间 - 声称它找不到目录刚刚创建的!

有时它找不到任何创建的子文件夹,有时它适用于一些而不是其他人。

目前的工作理论是,虽然创建文件夹的线程认为它们是创建的(并且对Directory.Exists的检查返回true,因为无论文件夹中有多少文件,我们只尝试创建每个文件夹一次)他们还没有真正完全在操作系统上完全创建,当我们试图从其他线程访问它们时,它会爆炸!

曾经见过/听说过这样的事情吗?

我们的工作理论是否正确,如果是的话,解决这个问题的最好方法是什么? (我宁愿不只是在睡觉!)

回答

0

这可以通过访问修改后的闭包来解释吗?

我想这取决于你的循环是什么样子,但是从我所看到的,然后如果你存储执行代表以后再有就是你没有得到的目录名称值,你可能的可能性期待。

看一看http://www.yoda.arachsys.com/csharp/csharp2/delegates.html下的捕获变量一节。

+0

我很无聊 - 没有修改关闭在这里涉及。我可以从日志中看到,我们得到的所有错误都是针对我们期望从我们的文件列表获得的不同文件名。 – Argos

相关问题