Низкая производительность при изменении appSettings - PullRequest
0 голосов
/ 11 октября 2018

У меня есть приложение, в котором я создаю 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 голосов
/ 11 октября 2018

Как и при любой обработке файлов, вам нужно открыть файл один раз , внести все изменения и затем сохранить файл один раз .Как вы его структурировали, файл открывается для каждой записи, запись записывается, а затем файл сохраняется.

Только представьте, что вам нужно будет ввести это в редактор, и вы будете открывать и закрывать редактор после каждой строки вместо того, чтобы открывать один раз, вводить его все и затем сохранять один раз.

0 голосов
/ 11 октября 2018

Я считаю, что проблема в том, что вы открываете / сохраняете / обновляете и т. Д. Конфигурацию много раз, без необходимости.

Я быстро "встроил" требуемые вызовы, чтобы они выполнялись только при необходимости.и добавил 2-й метод, чтобы сделать рекурсивные вызовы без повторного открытия / сохранения.(НЕПРОВЕРЕНО)

Проверьте, работает ли это для вас.

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