更快地释放注册表句柄

时间:2013-11-25 14:22:20

标签: c# windows resources

C#3.5,Windows 7 +

以下面的代码为例:

using (RegistryKey regKey = Registry.Users.OpenSubKey(regKeyString, true))
{
    if (polRegKey.GetValue("Foo") == null)
        polRegKey.CreateSubKey("Foo");
}

现在让我说我每秒都在循环中执行这段代码。

当我随后使用Process Explorer查看正在运行的进程时,我看到的是生成该注册表项的新句柄,但未及时销毁。相反,我看到的是每秒创建一个新的句柄,然后在大约20秒后,几乎所有句柄的大块同时被破坏。这是我期望从垃圾收集器那种行为。我认为C#的using语句自动处理对象是错误的吗?它似乎以一种非常懒惰的方式进行,如果它实际上是在做它。

2 个答案:

答案 0 :(得分:5)

您没有处置polRegKey.CreateSubKey("Foo");的值。

using (RegistryKey regKey = Registry.Users.OpenSubKey(regKeyString, true))
{
    if (polRegKey.GetValue("Foo") == null) {
        using (polRegKey.CreateSubKey("Foo")) {
            Console.Writeline("Key Created!  You could also call Dispose()!");
        }
    }
}

答案 1 :(得分:3)

CreateSubKey() 也会返回 RegistryKey

你也需要处理那个返回的对象。