C# app.config中的设置何时实际读取?

C# app.config中的设置何时实际读取?,c#,.net,configuration,app-config,C#,.net,Configuration,App Config,应用程序何时实际读取app.config中的设置 假设我有一个windows服务和一些应用程序设置。在代码中,我有一个使用某些设置的方法。方法在每次迭代中都被调用,而不是在所有时间中只调用一次。如果我通过配置文件更改了设置值,我应该重新启动服务以便在内部“刷新”,还是下次在没有我方任何交互的情况下接受它?当您通过配置管理器(ConfigurationManager.GetSection(“x/y”);加载它时,或者当您尝试访问属性时 这里有一个轻微的灰色区域,因为当您通过配置管理器获取配置时:

应用程序何时实际读取app.config中的设置


假设我有一个windows服务和一些应用程序设置。在代码中,我有一个使用某些设置的方法。方法在每次迭代中都被调用,而不是在所有时间中只调用一次。如果我通过配置文件更改了设置值,我应该重新启动服务以便在内部“刷新”,还是下次在没有我方任何交互的情况下接受它?

当您通过配置管理器(ConfigurationManager.GetSection(“x/y”);加载它时,或者当您尝试访问属性时

这里有一个轻微的灰色区域,因为当您通过配置管理器获取配置时:

var config=(MyConfigSection)ConfigurationManager.GetSection(“MyConfigSection”);
如果在配置文件顶部的configurationSections元素中提供了配置节类型,则可以返回配置对象。如果您实际上没有提供实际的配置,您仍然会得到一个对象

但是,如果您有一个未设置的必填字段,则在调用该属性之前不会引发异常。我在尝试对自定义配置部分进行单元测试时解决了这个问题。

您需要调用方法来直接从磁盘读取最新的值。这里有一个简单的方法来测试并回答您的问题:

static void Main(string[] args)
{
    while (true)
    {
        // There is no need to restart you application to get latest values.
        // Calling this method forces the reading of the setting directly from the config.
        ConfigurationManager.RefreshSection("appSettings");
        Console.WriteLine(ConfigurationManager.AppSettings["myKey"]);

        // Or if you're using the Settings class.
        Properties.Settings.Default.Reload();
        Console.WriteLine(Properties.Settings.Default.MyTestSetting);

        // Sleep to have time to change the setting and verify.
        Thread.Sleep(10000);
    }
}
我的app.config包含:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="ConsoleApplication2.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <appSettings>
    <add key="myKey" value="Original Value"/>
  </appSettings>
  <userSettings>
    <ConsoleApplication2.Properties.Settings>
      <setting name="MyTestSetting" serializeAs="String">
        <value>Original Value</value>
      </setting>
    </ConsoleApplication2.Properties.Settings>
  </userSettings>
</configuration>

原值
启动应用程序后,打开build文件夹中的app.config,并更改appSetting“myKey”的值。您将看到新值打印到控制台


要回答这个问题,是的,我认为它们在第一次读取时都会被缓存,要强制直接从磁盘读取,您需要刷新分区。

如果我得到如下设置:Properties.Settings.Default.MyValue?使用Properties.Settings.Default.Reload()@26071986-我已经更新了我的答案,以反映使用设置类时的代码。谢谢。现在好多了:)请注意,在我的机器上,这只在没有附加调试器的情况下工作。