我做了一个功能自动定时下载订单的 默认为5分钟下载一次。系统使用中。这个时候我改了一下app.config 文件 修改设置时间:10分钟下载一次。在不重启系统的情况。如果让定时器自动重置为10分钟下载一次。C#

解决方案 »

  1.   

    做个timer,每次都重新读取配置文件
      

  2.   

    你说的系统不是指操作系统,指的是这个软件系统本身吧?那要看你读取app.config的时间设置是在程序运行之初,还是运行中时常会去读取了。如果只在运行之初读取,那么必须关闭,再重新运行系统;否则的话你就耐心等待呗
      

  3.   

    我的意思是:软件系统 定时器 在开启着下载订单,默认是5分钟 。客户感觉有点快,就直接在Config文件里 改了一下10分钟。 软件系统 客户没有重启,要求 定时器立刻按照新修改的10分钟下载。
      

  4.   

    直接修改config,必须重新启动软件才能生效,因为exe运行时已经缓存了信息,除非你重新运行修改才能生效通常需要及时生效的东西,需要直接做文件缓存依赖,而不是直接依靠默认机制去访问app.config
      

  5.   


    解决了,我给大家分享一下。不需要重启软件程序的。哈哈
    更改windows服务的配置文件(app.config)必须重启服务才能生效吗?
    这个问题是前一阶段写windows服务碰到的。本来在写获取配置文件的某个配置的值的时候,通常我都是写类似下面的这么一个静态方法来获取:
     
       1:          /// <summary>    2:          /// 获取每次处理记录数    3:          /// </summary>    4:          /// <returns></returns>    5:          private static int GetRecordCount()    6:          {    7:              int recordCount = 10000;    8:              try    9:              {   10:                  recordCount = Math.Abs(int.Parse(ConfigurationManager.AppSettings["RecordCount"]));   11:                  if (recordCount==0)   12:                  {   13:                      recordCount = 10000;   14:                  }   15:              }   16:              catch    17:              {   18:                  recordCount = 10000;   19:              }   20:              return recordCount;   21:          } 
    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应用程序。
      

  6.   


    更改windows服务的配置文件(app.config)必须重启服务才能生效吗?
    这个问题是前一阶段写windows服务碰到的。本来在写获取配置文件的某个配置的值的时候,通常我都是写类似下面的这么一个静态方法来获取:
     
       1:          /// <summary>    2:          /// 获取每次处理记录数    3:          /// </summary>    4:          /// <returns></returns>    5:          private static int GetRecordCount()    6:          {    7:              int recordCount = 10000;    8:              try    9:              {   10:                  recordCount = Math.Abs(int.Parse(ConfigurationManager.AppSettings["RecordCount"]));   11:                  if (recordCount==0)   12:                  {   13:                      recordCount = 10000;   14:                  }   15:              }   16:              catch    17:              {   18:                  recordCount = 10000;   19:              }   20:              return recordCount;   21:          } 
    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应用程序。
      

  7.   

    呵呵,的确你用代码控制修改并且使用代码刷新就可以立即生效不过我们一开始以为你是手工在文本编辑器里修改config,这样的修改那是没办法立刻生效的
      

  8.   

    不是有Timer么,10分钟重新读取一次!
      

  9.   

    另起一个Timer,修改app.config后调用下面这句代码就可以了。ConfigurationManager.RefreshSection("appSettings");
      

  10.   


    手动也可以。手动改app.config 也可以的。