关于.NET 4.0文件系统枚举功能的奇怪之处

cod*_*nix 16 .net enumeration file .net-4.0 c#-4.0

我刚看了一页"什么是新的.NET Framework 4.0".我无法理解最后一段:

删除枚举目录或文件上的打开句柄

  1. 创建自定义方法(或Visual Basic中的函数)以包含您的枚举代码.

  2. 将带有NoInlining选项的MethodImplAttribute属性应用于新方法.例如:

    [MethodImplAttribute(MethodImplOptions.NoInlining)] Private void Enumerate()

  3. 包含以下方法调用,以在枚举代码后运行:

      * The GC.Collect() method (no parameters).
      * The GC.WaitForPendingFinalizers() method.
    
    Run Code Online (Sandbox Code Playgroud)

为什么属性NoInlining?内联有什么危害吗?

为什么不手动调用垃圾收集器,为什么不首先使枚举器实现IDisposable?我怀疑他们使用FindFirstFile()/ FindNextFile()API调用进行实现,因此如果枚举完成,则必须在任何情况下调用FindClose().

编辑:

有没有人知道为什么在文章中建议使用NoInlining属性?

Han*_*ant 4

相当奇怪。迭代器正确实现了 IDisposable,它调用 FindClose()。AllDirectories 选项可能会带来麻烦,因为 FindFileFirst/Next 只允许迭代单个目录。但我看到迭代器做了正确的事情,它在迭代目录结构时只保持单个句柄打开。

MSDN 文章特别提到“如果枚举目录或文件之一上保留有打开的句柄”。FindFileFirst/Next 不会让句柄保持打开状态。但在枚举时读取文件的草率用户代码确实如此。“对文件或目录的删除操作”也相关,我认为 Vista 中的行为发生了变化。DeleteFile() 可以成功,但文件实际上不会消失,直到文件上的所有句柄都关闭为止。

我们需要有人自愿,而不是在 XP 上实现此代码。我想我们很快就会找到人:)