2011-07-08 152 views
0

在asp.net中存儲共享對象的最佳方法是什麼?它會在每個請求中每次請求多次調用。我一直在使用這兩種方法,但我想知道是否有更好的方法。我每小時刷新一次這個對象。共享asp.net對象爲靜態或緩存

public static List<ResourceObject> SharedResources = new List<ResourceObject>() 

//OR 

public static List<ResourceObject> SharedResources 
{ 
    get 
    { 
     List<ResourceObject> _sharedResources = HttpContext.Current.Cache["RedirectRoutes"] as List<ResourceObject>; 
     if (_sharedResources == null) 
     { 
      _sharedResources = LoadNewSharedResource(); 
      HttpContext.Current.Cache["RedirectRoutes"] = _sharedResources; 
     } 

     return _redirectRoutes; 
    } 
    set 
    { 
     HttpContext.Current.Cache["RedirectRoutes"] = value; 
    } 
} 
+2

兩者看起來不夠合理,取決於您的確切需求。但請注意,如果有任何內容正在更改返回的'List '(添加/刪除元素等),那麼您可能會看到問題。你最好返回像'ReadOnlyCollection '這樣的東西來防止任何突變。 – LukeH

+0

我實際上通常忽略了'set'。所以,我認爲這可以防止這個問題。 – zeal

+1

不,一個集合實際上是可以的,因爲引用賦值是保證原子的(在公共字段的情況下)並且ASP.NET'Cache'類保證是線程安全的(在屬性的情況下)。我在談論的是像'SharedResources.Add(/ * something * /)','SharedResources.RemoveAt(0)'等東西。這些可能在多線程環境中運行時失敗。 – LukeH

回答

2

如果你的對象經常變化(例如你提到的每小時一次),那麼你最好使用緩存,因爲它可以幫你照顧臉紅(假設你在添加值時傳遞了正確的參數到高速緩存)。如果您使用靜態值,則不會每小時自動清除一次,因此您需要自行執行檢查。

1

如果看起來像這樣,一個對象需要持續請求,那麼這是一個非常好的和合理的方式來實現它。如果緩存版本在一次調用中被多次訪問,您可能希望將其放入一個局部變量中,以保存每次都從緩存中檢索它。

是否存在像您所關心的緩存特定問題?

+0

我最關心的只是使用靜態對象而不是將它存儲在緩存中。我想我只需要再次保證我所做的就是不會皺眉。 – zeal

+0

它不會被我皺起了眉頭。 –