2008-08-07 58 views
20

我打算將我的所有配置設置存儲在應用程序的app.config部分(使用ConfigurationManager.AppSettings類)。當用戶使用應用程序的UI更改設置(單擊複選框,選擇單選按鈕等)時,我打算將這些更改寫入AppSettings。與此同時,在程序運行時,我打算不斷地從一個不斷處理數據的進程中訪問AppSettings。通過用戶界面對設置進行的更改需要實時影響數據處理,這就是爲什麼該過程將持續訪問AppSettingsConfigurationManager.AppSettings性能問題

這是一個關於性能的好主意嗎?在編寫.Net應用程序時,使用AppSettings應該是「正確的方式」來存儲和訪問配置設置,但我擔心這種方法不適用於恆定負載(至少在不斷讀取設置的情況下)。

如果有人有這方面的經驗,我會非常感激的輸入。

更新:我應該澄清幾點。

這不是一個Web應用程序,因此將數據庫連接到應用程序可能會過度簡單地用於存儲配置設置。這是一個Windows窗體應用程序。

根據MSDN文檔,ConfigurationManager不僅用於存儲應用程序級別設置,還用於存儲用戶設置。 (尤其重要,如果,例如,應用程序安裝的部分信任的應用程序。)

更新2:我接受lomaxx的答案,因爲Properties確實看起來像一個很好的解決方案,而無需添加任何附加層到我的應用程序(如數據庫)。使用屬性時,它已經完成了其他人建議的所有緩存。這意味着任何更改和後續讀取都在內存中完成,使其非常快速。當您明確告訴它時,屬性只會將更改寫入磁盤。這意味着我可以在運行時即時更改配置設置,然後在程序退出時只做最後的保存。

只是爲了驗證它實際上能夠處理我需要的負載,我在我的筆記本電腦上做了一些測試,並且能夠使用屬性每秒執行750,000次讀取和7,500次寫入。這是遠遠超出我的應用程序將有史以來甚至接近需要我覺得使用屬性相當安全,而不影響性能。

回答

8

因爲您使用的是winforms應用程序,如果它在.net 2.0中,實際上有一個專門用於此目的的用戶設置系統(稱爲屬性)。 This article on MSDN對此有一個很好的介紹

如果你仍然擔心性能,那麼看看SQL Compact Edition這與SQLite類似,但是我發現微軟提供的與winforms搭配非常好,甚至還有能力make it work with Linq

1

有人糾正我,如果我錯了,但我不認爲AppSettings通常用於這些類型的配置設置。通常情況下,你只會放入相當靜態的設置(數據庫連接字符串,文件路徑等)。如果要存儲可定製的用戶設置,最好創建一個單獨的首選項文件,或理想地將這些設置存儲在數據庫中。

0

請問爲什麼你不把用戶的設置保存在數據庫中?

通常,我會保存appSettings部分中很少更改的應用程序設置(默認的電子郵件地址錯誤日誌發送到,自動註銷的分鐘數等等)。真正的範圍處於應用程序中,而不是用戶處,通常用於部署設置。

0

我想要做的一件事就是在讀取上緩存appsettings,然後在寫入時從緩存中清除設置,以儘量減少服務器處理appSettings所需的實際負載量。

此外,如果可能,請考慮打破應用程序設置爲configSections,以便您可以讀取寫入和緩存相關設置。

說了這麼多,我會認真考慮將這些值存儲在數據庫中,因爲您似乎實際上正在存儲用戶首選項,而不是應用程序設置。

2

檢出SQLite,它似乎是這種特殊情況的一個很好的選擇。

1

我不會使用配置文件來存儲用戶數據。使用分貝。

2

迪倫,

不要使用應用程序配置文件用於此目的,使用SQL數據庫(SQLite的,MySQL和MSSQL,無論),因爲你必須期間少擔心併發問題讀寫配置文件。

您還可以在要存儲的數據類型中擁有更好的靈活性。 appSettings部分只是一個鍵/值列表,隨着時間的推移和應用程序的成熟,您可能會長大。您可以使用自定義配置部分,但是當涉及到設計時,則會進入新的問題區域。

2

appSettings並不是真正意義上的你想要做的。

當您的.NET應用程序啓動時,它會讀取app.config文件,並將其內容緩存在內存中。因此,在寫入app.config文件之後,您必須強制運行時重新解析app.config文件,以便它可以再次緩存設置。這是不必要的

最好的辦法是使用數據庫來存儲配置設置。

除非使用數據庫,否則可以輕鬆設置外部XML配置文件。當您的應用程序啓動時,您可以將其內容緩存在NameValueCollection對象或HashTable對象中。在更改/添加設置時,您可以將其添加到該緩存副本中。當您的應用程序關閉時,或者在適當的時間間隔內,您可以將緩存內容寫回文件。