转载 

更改windows服务的配置文件(app.config)必须重启服务才能生效吗?windows Services C#

分类:    896人阅读    IT小君  2015-05-18 17:11

这个问题是前一阶段写windows服务碰到的。本来在写获取配置文件的某个配置的值的时候,通常我都是写类似下面的这么一个静态方法来获取:

/// <summary>
          /// 获取每次处理记录数
             /// </summary>
             /// <returns></returns>
             private static int GetRecordCount()
            {
               int recordCount = 10000;
               try
                {
                    recordCount = Math.Abs(int.Parse(ConfigurationManager.AppSettings["RecordCount"]));
                    if (recordCount==0)
                    {
                        recordCount = 10000;
                    }
                }
              catch 
               {
                    recordCount = 10000;
               }
               return recordCount;
            }

RecordCount表示每次从数据库读取的记录数。在服务写好安装后测试的时候,这个参数改过好几次,起初它的默认值是10000,后来分别改过为500,100,50和10。可是改完之后我不得不重启服务才能让配置文件起作用。经过几次这种折腾之后,感觉体验太差了。上网一搜,找到了这一篇:Do you have to restart a windows service if you change the app.config? 在原问题中,一个哥们给出了解答,就是通过ConfigurationManager.RefreshSection刷新某一配置节点,我们获取配置值的时候就不需要重启服务了:
/// <summary>
        /// 获取每次处理记录数
        /// </summary>
        /// <returns></returns>
        private static int GetRecordCount()
        {
            int recordCount = 10000;
            try
            {
                ConfigurationManager.RefreshSection("appSettings");// 刷新命名节,在下次检索它时将从磁盘重新读取它。
                recordCount = Math.Abs(int.Parse(ConfigurationManager.AppSettings["RecordCount"]));
                if (recordCount == 0)
                {
                    recordCount = 10000;
                }
            }
            catch
            {
                recordCount = 10000;
            }
            return recordCount;
        }



经过测试,确实如此。

你可能会问,为什么加了那一行ConfigurationManager.RefreshSection(命名节点);就可以了呢?

查看MSDN 

,解释是这样的:“刷新命名节,这样在下次检索它时将从磁盘重新读取”。下面是VS里的函数说明:

     //
        // 摘要:
        //     刷新命名节,这样在下次检索它时将从磁盘重新读取它。
        //
        // 参数:
        //   sectionName:
        //     要刷新的节的配置节名称或配置路径和节名称。
        public static void RefreshSection(string sectionName);

原来,更改配置文件之后,应用程序读取配置的顺序不是从物理文件读取,而是从其缓存中读取(ConfigurationManager.RefreshSection方法在不影响其他节的前提下使指定配置节的缓存失效),必须强制刷新配置文件,才能读取到更改后的配置节信息 。

毫无疑问,和正常的读取配置文件节点方法相比,这个读取配置的方法在性能上应该有点影响,至于损失多少,会不会造成性能瓶颈,你懂的。

最后,从MSDN的例子我们也可以看出来,这个方法对于动态写入/读取配置文件非常有效。不过对于web应用程序这个方法可能不适合,因为大家知道,修改web.config相当于重启了web应用程序。


点击广告,支持我们为你提供更好的服务

jQuery右端悬浮带返回顶部特效

响应式时尚单品在线商城网站模板

html5 canvas彩色碎片组合球形旋转动画特效

网页设计开发公司网站模板

响应式太阳能能源公司网站模板

HTML5数字产品服务公司网站模板

js+css3抽奖转盘旋转点餐代码

html5 canvas进度条圆环图表统计动画特效

css+js实现的颜色渐变数字时钟动画特效

小众时尚单品在线电子商务网站模板

响应式咖啡饮品宣传网站模板

canvas炫酷鼠标移动文字粒子特效

有机水果蔬菜HTML5网站模板

中小型创意设计服务公司网站模板

HTML5现代家居装潢公司网站模板

现代时尚家具公司网站模板

HTML5 Canvas竖直流动线条背景动画特效

html5图标下拉搜索框自动匹配代码

html5 svg夜空中星星流星动画场景特效

css鼠标跟随文字模糊特效

点击广告,支持我们为你提供更好的服务
 工具推荐 更多»
点击广告,支持我们为你提供更好的服务