Cambie el archivo de configuración (app.config) del servicio de Windows sin reiniciar

Este problema se encontró en la etapa anterior de escribir el servicio de Windows. Originalmente, al escribir el valor de una configuración en el archivo de configuración, generalmente escribo un método estático como el siguiente para obtenerlo:

   1:           /// <resumen>
   2:           /// Obtenga el número de registros procesados ​​cada vez
   3:           /// </summary>
   4:           /// <retornos> </returnos>
   5:           private  static  int GetRecordCount ()
   6:           {
   7:               int recordCount = 10000;
   8:               prueba
   9:               {
  10:                   recordCount = Math.Abs ​​( int .Parse (ConfigurationManager.AppSettings [ "RecordCount" ]));
  11:                   si (recordCount == 0)
  12:                   {
  13:                       recordCount = 10000;
  14:                   }
  15:               }
  16:               captura 
  17:               {
  18:                   recordCount = 10000;
  19:               }
  20:               return recordCount;
  21:           }

RecordCount representa el número de registros leídos de la base de datos cada vez. Cuando el servicio se escribió y probó después de la instalación, este parámetro se modificó varias veces: al principio, su valor predeterminado era 10000 y luego se cambió a 500, 100, 50 y 10, respectivamente. Pero después del cambio, tuve que reiniciar el servicio para que el archivo de configuración funcionara. Después de varios lanzamientos, sentí que la experiencia fue muy mala. búsqueda en Internet y encontró la siguiente: ? ¿Tiene el que tenga que reiniciar Windows Service Un cambio en el If que el app.config  en el problema original, un hombre da la respuesta es a través de la ConfigurationManager. RefreshSection actualización de una configuración de nodo, obtenemos No es necesario reiniciar el servicio al configurar los valores:

        /// <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;
        }

Después de la prueba, este es el caso.

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

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

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

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

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

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

发布了28 篇原创文章 · 获赞 15 · 访问量 11万+

Supongo que te gusta

Origin blog.csdn.net/z3h0a5n8g8x9i9a2o3/article/details/9995229
Recomendado
Clasificación