是否有一種簡單的方法通過線程安全接口訪問基於System.Configuration的自定義配置數據,而不需要每個執行上下文來加載/重新加載配置信息,這在計算上會很繁瑣?線程安全地使用System.Configuration
System.Configuration類,像大多數(全部?)其他類微軟的.Net庫文件中,被標註有下列線程安全的信息:
任何公共靜態(在Visual Basic中的Shared)成員這種類型是線程安全的。 任何實例成員不保證是線程安全的。
通過我的這個閱讀,ConfigurationSection
對象從ConfigurationManager.GetSection(string)
和其他類似的方法(例如OpenExeConfiguration(string exePath).GetSection(string)
)不能被認爲是線程安全返回,因此不應由多個執行環境中使用。這禁止將ConfigurationSection
存儲在一個本來是線程安全的單例中,因爲雖然對section對象的訪問可能是安全的,但對象上的成員本身並不安全。
然而,多次調用GetSection
可能需要重新解析配置文件並分配新的ConfigurationSection
實例,這些實例的開銷很高,因爲配置在初始化後可能不會改變。此外,將配置數據複製到已經成爲線程安全的另一個對象似乎打破了首先使用內置配置包的主要優點之一(可輕鬆訪問類型轉換和驗證的配置信息,而不需要太多的樣板文件碼)。
那麼,有沒有辦法使用System.Configuration
線程安全的方式,而不訴諸多餘的解析和配置節的分配?即使您通過System.Configuration
接口訪問它,執行自己的ConfigurationSection
是否使您免於提供由Microsoft提供的擔保(如果是這樣,您將如何在訪問基礎ConfigurationSection
的索引器時將其實施爲線程安全的是否需要訪問配置的數據)?
我一直有一個IIS服務器過去5個月隨機崩潰,因爲這一點。不知道爲什麼(崩潰是MSCorLib中的堆棧溢出),直到它發生在我的開發機器上,並且appsettings調用導致了它。我認爲這回答了我的問題。謝謝。 – 2013-08-22 20:58:03