2014-02-14 88 views
1

使用異步

基本上當什麼緩存機制是最好的asp.net MVC 5,我試圖找出什麼樣的緩存機制是最好的(和最簡單的)一個asp.net MVC5解。 在以前的同步解決方案中,我使用了一個靜態字典,並在訪問它時使用了lock關鍵字。

private static Dictionary<string, object> _cache; 
    private static object _cacheLocker = new object(); 

    private object GetFromCache(string key) 
    { 
     return _cache[key]; 
    } 

    private void AddToCache(string key, object value) 
    { 
     lock (_cacheLocker) 
     { 
      _cache.Add(key, value); 
     } 
    } 

但我認爲在異步世界中必須有一個更優雅的方式來做到這一點。

我應該在異步方法緩存?只有值或包含在任務內的值

謝謝。

+0

緩存有沒有關係是異步的,但使用的是靜態字典實例作爲緩存是不好的想法無論如何。 http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.110).aspx –

+0

我知道這不是一個好主意。這就是爲什麼我現在想要阻止我的罪過:-)我的問題的第二部分。緩存任務中包裝的值有什麼好處嗎? – thomas

回答

1

我正在使用此方法進行緩存。

protected ObjectCache cache = MemoryCache.Default; 
    protected T GetCacheOrExecute<T>(string key, Func<T> addToCacheFunction) 
    { 
     if (cache.Contains(key)) 
     { 
      return (T)cache.Get(key); 
     } 
     else 
     { 
      T retValue = default(T); 
      if (null != addToCacheFunction) 
      { 
       retValue = addToCacheFunction(); 
       var cachItem = new CacheItem(key, retValue); 
       CacheItemPolicy policy = new CacheItemPolicy(); 
       policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(30); //The cache time out 
       cache.Add(cachItem, policy); 
      } 
      return retValue; 
     } 
    } 

我這樣稱呼它:

public async Task<IEnumerable<User>> GetAllUsersAsync() 
    { 
     return await base.GetCacheOrExecute("users", doGetAllUsersAsync); // 
    } 

    private async Task<IEnumerable<User>> doGetAllUsersAsync() { 
     //more code... 
    } 

希望這有助於...

+1

謝謝。我會測試它.... – thomas