修改 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);
}
}
与任何文件处理一样,您需要打开文件一次,进行所有更改,然后保存文件一次。按照您构建它的方式,为每个条目打开文件,写入条目,然后保存文件。
想象一下,您必须将其输入到编辑器中,并且您将在每行之后打开和关闭编辑器,而不是打开一次,全部输入然后保存一次。
我有一个应用程序,我在其中从数据库的值创建一个 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);
}
}
与任何文件处理一样,您需要打开文件一次,进行所有更改,然后保存文件一次。按照您构建它的方式,为每个条目打开文件,写入条目,然后保存文件。
想象一下,您必须将其输入到编辑器中,并且您将在每行之后打开和关闭编辑器,而不是打开一次,全部输入然后保存一次。