c# - Directory.CreateDirectory 能否使一个文件夹可从一个线程访问但不能从其他线程访问?

标签 c# multithreading directory

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

 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,因为无论我们在文件夹中有多少文件,我们只尝试创建每个文件夹一次)它们实际上并没有在操作系统上正确地完全创建,当我们尝试从其他线程访问它们时,它会爆炸!

以前见过/听说过这样的事情吗?

我们的工作理论是否正确?如果正确,解决此问题的最佳方法是什么? (我宁愿不只是 sleep !)

最佳答案

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

我猜这取决于你的循环看起来像什么,但从我所看到的情况来看,如果你存储委托(delegate)以供稍后执行,那么你有可能得不到你可能获得的 dirName 值期待。

看看http://www.yoda.arachsys.com/csharp/csharp2/delegates.htmlCaptured variables 部分下。

关于c# - Directory.CreateDirectory 能否使一个文件夹可从一个线程访问但不能从其他线程访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16082056/

相关文章:

java - 工作线程发送到 sleep 后,CompletableFuture没有响应

c# - Windows服务在Docker容器中启动后立即关闭

c# - Ultrachart基础设施

c# - OS X 上的 Mono 与 MSVC 2010 同行兼容吗?

c# - 如何在扩展/方法文件中使用 Invoke 方法?

c# - 具体来说,在 Unity 中, "where"是否真的等待返回?

bash - 对目录使用 rm -rf

python - 如何添加默认路径以在其中查找 python 脚本文件?

python - 区分Python中的文件和目录

订阅域事件时的 C# AppDomain 沙箱安全异常