从 applicationSettings 读取设置很慢?
Reading settings from applicationSettings is very slow?
我有一个 C# WinForms 应用程序,它在我的 App.config 文件中存储了 4 个设置(特别是在 applicationSettings 部分)。这些设置是通过 Visual Studio 中的项目 -> 属性 -> 设置 UI 创建的。我的 App.config 文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="MyTestApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<applicationSettings>
<MyTestApp.Properties.Settings>
<setting name="LocalServerIpAddress" serializeAs="String">
<value>192.168.1.100</value>
</setting>
<setting name="LocalServerPort" serializeAs="String">
<value>59179</value>
</setting>
<setting name="RemoteServerIpAddress" serializeAs="String">
<value>192.168.1.200</value>
</setting>
<setting name="RemoteServerPort" serializeAs="String">
<value>59744</value>
</setting>
</MyTestApp.Properties.Settings>
</applicationSettings>
</configuration>
当我的应用程序从我的主窗体的 Load() 事件处理程序启动时,我读取了这些设置,如下所示:
public partial class Form1 : Form
{
string LocalServerIpAddress = string.Empty;
string LocalServerPort = string.Empty;
string RemoteServerIpAddress = string.Empty;
string RemoteServerPort = string.Empty;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
bool settingsLoaded = ReadSettingsFromAppConfig();
if (!settingsLoaded)
{
MessageBox.Show("An error occured while loading the application settings! Click OK to exit the application.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
}
private bool ReadSettingsFromAppConfig()
{
bool settingsLoaded = true;
try
{
This.LocalServerIpAddress = Properties.Settings.Default.LocalServerIpAddress;
This.LocalServerPort = Properties.Settings.Default.LocalServerPort;
This.RemoteServerIpAddress = Properties.Settings.Default.RemoteServerIpAddress;
This.RemoteServerPort = Properties.Settings.Default.RemoteServerPort;
}
catch (Exception)
{
settingsLoaded = false;
}
return settingsLoaded;
}
}
我一直在 运行2013 年 Visual Studio 测试机器上 运行 Windows 7 x86 运行我的应用程序,一切正常。今天早上,我构建了我的应用程序安装程序,用于部署应用程序、配置文件、.NET 4.5.2 等。然后我将我的应用程序安装在一台相同的测试机器上(没有安装 Visual Studio)和 运行 它。令我惊讶的是,我的主形态出现了将近 20 秒。在为这个问题苦苦思索了一段时间之后,我下载了 JetBrains 出色的 dotTrace 分析器的试用版,并 运行 它针对我在测试机上的应用程序。
至少可以说,我很惊讶地看到对 ReadSettingsFromAppConfig() 的调用花了将近 20 秒才完成!我已经 运行 分析器多次,每次调用 ReadSettingsFromAppConfig() 都需要 20 秒正负 100 - 200 毫秒。我完全不知道是什么导致了这种情况,尤其是因为当应用程序 运行 在 Visual Studio 中时我没有观察到这种行为。设置最终被正确读取,但似乎需要花费大量时间才能发生这种情况。
我还在 VM 运行ning Windows 7 x64 和 Windows 8.1 x64 中测试了我的应用程序,应用程序立即启动。听起来很疯狂,我想知道它是否与测试机器上的平台有关(x86 而不是 x64)。 FWIW,我的应用程序是针对 "Any CPU" 构建的。有没有人在使用 applicationSettings 时经历过这种行为?
如果您使用:
,开销会更少
<appSettings>
而不是:
<applicationSettings>
但是,你会失去一些好处(例如类型检查),所以这是一个让步。
我有一个 C# WinForms 应用程序,它在我的 App.config 文件中存储了 4 个设置(特别是在 applicationSettings 部分)。这些设置是通过 Visual Studio 中的项目 -> 属性 -> 设置 UI 创建的。我的 App.config 文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="MyTestApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<applicationSettings>
<MyTestApp.Properties.Settings>
<setting name="LocalServerIpAddress" serializeAs="String">
<value>192.168.1.100</value>
</setting>
<setting name="LocalServerPort" serializeAs="String">
<value>59179</value>
</setting>
<setting name="RemoteServerIpAddress" serializeAs="String">
<value>192.168.1.200</value>
</setting>
<setting name="RemoteServerPort" serializeAs="String">
<value>59744</value>
</setting>
</MyTestApp.Properties.Settings>
</applicationSettings>
</configuration>
当我的应用程序从我的主窗体的 Load() 事件处理程序启动时,我读取了这些设置,如下所示:
public partial class Form1 : Form
{
string LocalServerIpAddress = string.Empty;
string LocalServerPort = string.Empty;
string RemoteServerIpAddress = string.Empty;
string RemoteServerPort = string.Empty;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
bool settingsLoaded = ReadSettingsFromAppConfig();
if (!settingsLoaded)
{
MessageBox.Show("An error occured while loading the application settings! Click OK to exit the application.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
}
private bool ReadSettingsFromAppConfig()
{
bool settingsLoaded = true;
try
{
This.LocalServerIpAddress = Properties.Settings.Default.LocalServerIpAddress;
This.LocalServerPort = Properties.Settings.Default.LocalServerPort;
This.RemoteServerIpAddress = Properties.Settings.Default.RemoteServerIpAddress;
This.RemoteServerPort = Properties.Settings.Default.RemoteServerPort;
}
catch (Exception)
{
settingsLoaded = false;
}
return settingsLoaded;
}
}
我一直在 运行2013 年 Visual Studio 测试机器上 运行 Windows 7 x86 运行我的应用程序,一切正常。今天早上,我构建了我的应用程序安装程序,用于部署应用程序、配置文件、.NET 4.5.2 等。然后我将我的应用程序安装在一台相同的测试机器上(没有安装 Visual Studio)和 运行 它。令我惊讶的是,我的主形态出现了将近 20 秒。在为这个问题苦苦思索了一段时间之后,我下载了 JetBrains 出色的 dotTrace 分析器的试用版,并 运行 它针对我在测试机上的应用程序。
至少可以说,我很惊讶地看到对 ReadSettingsFromAppConfig() 的调用花了将近 20 秒才完成!我已经 运行 分析器多次,每次调用 ReadSettingsFromAppConfig() 都需要 20 秒正负 100 - 200 毫秒。我完全不知道是什么导致了这种情况,尤其是因为当应用程序 运行 在 Visual Studio 中时我没有观察到这种行为。设置最终被正确读取,但似乎需要花费大量时间才能发生这种情况。
我还在 VM 运行ning Windows 7 x64 和 Windows 8.1 x64 中测试了我的应用程序,应用程序立即启动。听起来很疯狂,我想知道它是否与测试机器上的平台有关(x86 而不是 x64)。 FWIW,我的应用程序是针对 "Any CPU" 构建的。有没有人在使用 applicationSettings 时经历过这种行为?
如果您使用:
,开销会更少<appSettings>
而不是:
<applicationSettings>
但是,你会失去一些好处(例如类型检查),所以这是一个让步。