2011-03-31 3 views
4

(ApplicationSettingsBaseから派生した)アプリケーション設定メカニズムは、マルチスレッドシナリオで使用されると、実際のボトルネックに見えます。特に、プロパティの照会が頻繁に行われると、それらの並列性がループを遅くしています。私はそれらの素晴らしいアプリケーション構成オプションを使用するためにとにかくそれらを使用するのが好きです。しかし、おそらく私はそれを私自身のキャッシュに包む必要がありますか?遅いApplicationSettingsBase

誰でも同じ問題がありますか?何か不足していますか?私は、ApplicationSettingsBaseは既にすべての設定をキャッシュしていると思いましたか?なぜ、複数のスレッドからのアクセスをまったくロックしないように見えますか?一般的な回避策は何ですか?

答えて

2

私はスレッドセーフな設定メカニズムを持っているので奇妙なannythingを参照してください?それが同時にあなたの痛みを遅くしているなら、あなたは早めに読み返しを問い合わせるローカル変数isteadを使ってみるべきです。私はあなたの設定要求機構の再設計がパフォーマンスをかなり助けると思う。

+0

あなたが正しいと思います。設定メカニズムは、このような使用方法のためのものではないようです。ありがとう。 – user492238

2

オブジェクトに「設定を取得する」機能をラップし、インターフェイスの背後に隠すことをお勧めします。

public class Worker 
{ 
    private readonly ISettings settings; 
    public Worker (ISettings settings) 
    { 
     this.settings = settings; 
    } 

    public void Work() 
    { 
     for (int i = 0; i < settings.MaxWorkerIterations(); i++) 
     { ... } 
    } 
} 

public interface ISettings 
{ 
    int MaxWorkerIterations(); 
} 

public class AppConfigSettings 
{ 
    public int MaxWorkerIterations() 
    { 
     return (int) ApplicationSettings["MaxWorkerIterations"]; 
    } 
} 

これは(ほとんど)コンパイル時のチェックと簡単なテスト容易性の利点があります。 AppConfigSettingsクラスをオーバーライドして、明白なCachingAppConfigSettingsクラスにすることもできます。

+1

本当にあなたの意見は表示されません。これはどのように状況を改善するでしょうか?しかし、他の修飾された回答がないため、私はあなたのソリューションをとにかく受け入れなければなりません。 ;) – user492238

+0

Yippie!同情受け入れ!私の答えは何が役に立たないのですか?私はこれにいくつかの不利な点や、キャッシングレイヤーを簡単に追加する方法について述べました。 –

+1

インターフェイスに設定をラップしても、質問に記載されているパフォーマンス上の問題は解決されません。とにかくありがとう;) – user492238