2011-03-31 185 views
4

在多線程場景中使用時,應用程序設置機制(派生自ApplicationSettingsBase)似乎是一個真正的瓶頸。尤其是,當經常查詢屬性時,它們引入的併發性會減慢我的循環。無論如何,我喜歡使用它們以獲得那些漂亮的應用程序配置選項。但也許我需要將它們包裝到我自己的緩存中,或者如此?Slow ApplicationSettingsBase

任何人都有同樣的問題?我錯過了什麼嗎?我想,ApplicationSettingsBase會緩存所有設置嗎?爲什麼它似乎鎖定來自多個線程的訪問?什麼可能是一個常見的解決方法?

回答

2

我看不出有什麼奇怪的線程安全設置機制?如果它減慢了你喜歡的併發遊戲,你應該嘗試使用局部變量而不是再次快速查詢getsetting。我認爲重新設計您的設置請求機制會顯着提高執行效率。

+0

我想你是對的。設置機制似乎不適用於這種使用方案。謝謝。 – user492238 2012-02-29 08:28:10

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 2012-02-25 15:35:03

+0

Yippie!可惜接受!我的答案是什麼沒有幫助?我提到了這方面的一些好處,以及如何輕鬆添加緩存層。 – 2012-02-27 15:59:12

+1

它沒有什麼幫助,因爲將設置包裝在界面中不會擺脫問題中描述的性能問題。無論如何;) – user492238 2012-02-29 08:19:56