9

計算的に負担となる構成情報のロード/再ロードから各実行コンテキストを必要とせずに、スレッドセーフなインターフェイスを介してカスタムSystem.Configurationベースの構成データにアクセスする簡単な方法はありますか?

System.Configurationクラスは、Microsoftの.Netライブラリドキュメントの他のほとんど(すべて?)のクラスと同様に、次のスレッドセーフ情報で注釈が付けられています。

このタイプのパブリックスタティック(Visual Basicで共有)メンバーはすべてスレッドセーフです。インスタンスメンバーは、スレッドセーフであることが保証されていません。

私がこれを読んだことにより、および他の同様のメソッド(たとえば)ConfigurationSectionから返されるオブジェクトはスレッドセーフであると見なされてはならず、したがって複数の実行コンテキストで使用されるべきではありません。これにより、セクションオブジェクトへのアクセスは安全である可能性がありますが、オブジェクト自体のメンバーは安全ではないため、スレッドセーフであるシングルトンにを格納することは禁止されています。ConfigurationManager.GetSection(string)OpenExeConfiguration(string exePath).GetSection(string)ConfigurationSection

ただし、への複数の呼び出しGetSectionでは、構成ファイルの再解析と、ConfigurationSection初期化後に構成が変更される可能性が低いことを考慮して、オーバーヘッドの高い新しいインスタンスを割り当てる必要があります。さらに、スレッドセーフにされた別のオブジェクトに構成データをコピーすると、最初に組み込みの構成パッケージを使用する主な利点の1つが無効になるようです(ボイラープレートをあまり使用せずに、型変換および検証された構成情報に簡単にアクセスできます)。コード)。

それで、System.Configuration構成セクションの過剰な解析と割り当てに頼ることなく、スレッドセーフな方法で使用する方法はありますか?独自の実装ConfigurationSectionにより、インターフェイスを介してアクセスしている場合でも、Microsoftが提供する保証の欠如から解放されますか(その場合、ベースのインデクサーSystem.Configurationへのアクセスが必要な場合に、スレッドセーフになるように実装するにはどうすればよいですか?ConfigurationSection構成されたデータへのアクセス)?

4

2 に答える 2

5

GetSection から返されたインスタンスは、スレッドセーフではありません。つまり、シングルトンで使用するには、ロック コードを追加する必要があります。

ファイルが変更されていない限り、複数の呼び出しはファイルを再解析しません。データはメモリにキャッシュされます。

スレッドの安全性の問題は、ロックを使用することで簡単に解決できます (実行時に構成を変更しない限り、必要になるかどうかはわかりません)。パフォーマンスの問題はありません。

于 2009-04-14T03:19:57.013 に答える
0

ConfigurationManager.GetSection(string) は public static メンバーであり、msdn は「この型のすべての public static (Visual Basic では共有) メンバーはスレッド セーフである」と述べているため、安全に使用できると想定できます。

パフォーマンスに関しては、MS がすでにかなり効率的に機能していると仮定して、その機能をそのまま使用します。注意: 時期尚早の最適化は悪の根源です。

于 2009-04-14T03:12:35.953 に答える