Windowsサービスのプロファイル(app.config)を変更するには、サービスを再起動する必要がありますか?

4956 ワード

この問題は前の段階でwindowsサービスを書いて出会ったのです.本来、取得プロファイルの構成値を書くときは、通常、次のような静的メソッドを書いて取得します.
   1:          /// 
   2:          ///          
   3:          /// 
   4:          /// 
   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でしたが、その後は500100、50、10に変更されました.しかし、変更が完了したら、プロファイルを機能させるためにサービスを再起動しなければなりません.何度もこのような振り回された後、体験があまりにも悪いと感じました.インターネットで検索して、この1篇を見つけました:Do you have to restart a windows service if you change the app.config? 元の問題では、コンフィギュレーションマネージャを通じてRefreshSectionは、構成ノードをリフレッシュします.構成値を取得するときにサービスを再起動する必要はありません.
        /// 
        ///          
        /// 
        /// 
        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アプリケーションを再起動したことに相当します.