可以目录.CreateDirectory使一个文件夹可以从一个线程访问,但不能从其他线程访问

本文关键字:一个 访问 线程 但不能 其他 CreateDirectory 文件夹 | 更新日期: 2023-09-27 18:09:55

我们有一个完整的路径列表我们想要复制一些文件到其中,就像这样

 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());

现在这里是奇怪的一点-大多数时候这工作得很好,但有时它失败了多个directorynotfoundexception -声称它找不到刚刚创建的目录!

有时它找不到任何已创建的子文件夹,有时它对某些文件夹有效,但对其他文件夹无效。

当前的工作原理是,尽管创建文件夹的线程认为它们已创建(并且检查Directory)。Exists返回true,因为无论我们在文件夹中有多少文件,我们只尝试创建每个文件夹一次)它们实际上没有在操作系统上正确地完全创建,当我们试图从其他线程访问它们时,它会砰!

以前见过/听说过这样的东西吗?

我们的工作理论是正确的吗?如果是,解决这个问题的最佳方法是什么?

可以目录.CreateDirectory使一个文件夹可以从一个线程访问,但不能从其他线程访问

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

我想这取决于你的循环看起来像什么,但从我所看到的,然后如果你存储委托执行之后,有可能你没有得到dirName值,你可能会期待。

查看捕获变量部分下的http://www.yoda.arachsys.com/csharp/csharp2/delegates.html