修改 appSettings 时性能不佳

Poor performance when modifying appSettings

我有一个应用程序,我在其中从数据库的值创建一个 TreeView 并用复选框显示它。 现在我想将选定的值写入 appSettings。我试图用这段代码来做到这一点。 但是性能太差了,这可能不是正确的方法。 我怎样才能更好地解决它?

public static void SearchAndSaveSelectedNodes(TreeNodeCollection nodes)
{
    foreach (TreeNode n in nodes)
    {
        DeleteSetting(n.Name);

        if (n.Checked)
        {
            UpdateSetting(n.Name, n.Name + "@" + n.FullPath);
        }
        SearchAndSaveSelectedNodes(n.Nodes);
    }
}

public static void DeleteSetting(string key)
{
    System.Configuration.Configuration config = `ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);`
    config.AppSettings.Settings.Remove(key);
    config.Save(ConfigurationSaveMode.Modified);
    ConfigurationManager.RefreshSection("appSettings");
    ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);
}

public static void UpdateSetting(string key, string value)
{
    System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    config.AppSettings.Settings.Remove(key);
    config.AppSettings.Settings.Add(key, value);
    config.Save(ConfigurationSaveMode.Modified);
    ConfigurationManager.RefreshSection("appSettings");
    ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);
}

我认为问题是你 open/save/refresh.. 等配置了很多次,冗余。

我已经快速 "inlined" 了所需的调用,因此它们仅在需要时执行,并添加了第二种方法来进行递归调用而无需重复 opening/saving。 (未测试)

检查是否适合您。

public static void SearchAndSaveSelectedNodes(TreeNodeCollection nodes)
{
    // open config (only once)
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

    // make edits (recursive)
    SearchAndSaveSelectedNodesRecursive(nodes, config);

    // save (only once)
    config.Save(ConfigurationSaveMode.Modified);
    // (afaik there is no need to refresh the section)
}

private static void SearchAndSaveSelectedNodesRecursive(TreeNodeCollection nodes, Configuration config)
{
    foreach (TreeNode n in nodes)
    {
        config.AppSettings.Settings.Remove(n.Name);
        if (n.Checked)
        {
            // no need to delete again here (it's already deleted)
            config.AppSettings.Settings.Add(n.Name, n.Name + "@" + n.FullPath);
        }
        SearchAndSaveSelectedNodesRecursive(n.Nodes, config);
    }
}

与任何文件处理一样,您需要打开文件一次,进行所有更改,然后保存文件一次。按照您构建它的方式,为每个条目打开文件,写入条目,然后保存文件。

想象一下,您必须将其输入到编辑器中,并且您将在每行之后打开和关闭编辑器,而不是打开一次,全部输入然后保存一次。