System.Configurationの安全な使用をスレッド
-
09-09-2019 - |
質問
計算負担となりロード/再ロード設定情報から各実行コンテキストを必要とせずに、スレッドセーフなインターフェースを介してカスタムSystem.Configurationベースの構成データにアクセスする簡単な方法はありますか?
System.Configurationクラス、などのほとんど(すべて?)Microsoftの.NETライブラリのドキュメント内の他のクラスは、以下のスレッド安全性情報で注釈を付けています。
(Visual BasicではShared)この型のpublic staticメンバは、スレッドセーフです。 インスタンスメンバーの場合は、スレッドセーフであるとは限りません。
この私の読み取りにより、ConfigurationSection
オブジェクトがConfigurationManager.GetSection(string)
から返さ及び他の同様の方法(例えばOpenExeConfiguration(string exePath).GetSection(string)
)は、スレッドセーフであると仮定してはならないので、複数の実行コンテキストによって使用されるべきではありません。これは、セクションオブジェクトへのアクセスが安全であり得るが、オブジェクト自体のメンバーが安全ではないので、それ以外の場合は、スレッドセーフであろうシングルトンにConfigurationSection
を格納する禁止
GetSection
に複数の呼び出しは、しかし、コンフィギュレーションを考慮し、高いオーバーヘッドがこれまでに初期化後に変更される可能性はない持っているコンフィギュレーションファイルの再解析および割り当て新しいConfigurationSection
インスタンスを必要とする可能性があります。さらに、スレッドセーフなされている別のオブジェクトに設定データをコピーする最初の場所に内蔵された構成パッケージを使用しての主な利点の1を倒すように思われる(容易なアクセスを型変換し、多くの決まり文句なしの構成情報を検証しますコード)ます。
だから、余分な解析およびコンフィギュレーション・セクションの割り当てに頼ることなく、スレッド・セーフな方法でSystem.Configuration
を使用する方法はありますか?あなたはConfigurationSection
インタフェースを介してそれにアクセスしているにもかかわらず、Microsoftが提供する保証がないことからあなたを解放(ベースSystem.Configuration
のインデクサーへのアクセスが必要なときにそうだとすれば、どのようにあなたは、スレッドセーフであることが、それを実装して、独自のConfigurationSection
を実装してい構成されたデータにアクセスするための)?
解決
GetSectionから返されたインスタンスは、スレッドセーフではありません。それはあなたがあなたのシングルトンでそれを使用するためには、ロックコードを追加する必要があることを意味します。
ファイルが変更されない限り、複数の呼び出しは、ファイルを再解析しません。データがメモリにキャッシュされます。
あなたのスレッドの安全性の問題は簡単に(私はあなたが実行時に設定を変更している場合を除き、あなたは、する必要がありますかわからない)ロックを使用することにより解決し、パフォーマンス上の問題はありませんされます。
他のヒント
ConfigurationManager.GetSection(文字列)のpublic staticメンバーで、MSDNの状態以来「(Visual BasicではShared)この型のpublic staticメンバーは、スレッドセーフで」、あなたはそれが使用しても安全だと仮定することができます。
は、パフォーマンスに関しては、私は、MSはすでにそれはかなり効率的になるとされてちょうどその機能を使用していることを前提とすることをいとわないだろう。注意:時期尚早の最適化は、悪の根である。
。