這個問題是前一階段寫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應用程序。