修改appSettings时性能不佳

时间:2018-10-11 09:35:38

标签: c# performance configuration app-config 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);
}

2 个答案:

答案 0 :(得分:3)

我相信问题是您多次重复打开/保存/刷新..等配置。

我已经快速“内联”了所需的调用,因此仅在需要时才执行它们,并添加了第二方法来进行递归调用,而无需重复打开/保存。 (未测试)

检查是否适合您。

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);
    }
}

答案 1 :(得分:1)

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

试想一下,您将不得不在编辑器中键入此内容,然后在每行之后打开和关闭编辑器,而不是先打开一次,然后全部键入然后保存一次。