可以目录.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,因为无论我们在文件夹中有多少文件,我们只尝试创建每个文件夹一次)它们实际上没有在操作系统上正确地完全创建,当我们试图从其他线程访问它们时,它会砰!
以前见过/听说过这样的东西吗?
我们的工作理论是正确的吗?如果是,解决这个问题的最佳方法是什么?
这是否可以通过访问修改过的闭包来解释?
我想这取决于你的循环看起来像什么,但从我所看到的,然后如果你存储委托执行之后,有可能你没有得到dirName值,你可能会期待。
查看捕获变量部分下的http://www.yoda.arachsys.com/csharp/csharp2/delegates.html