Mega Code Archive

 
Categories / C# / Development Class
 

Memory Cache Lock

using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Mvc30WebRole1.Util {     public class CacheUtility     {         private static Dictionary<string, object> MemCache = new Dictionary<string, object>();         private static Dictionary<string, object> MemCacheLocks = new Dictionary<string, object>();         private static List<string> keyNames = new List<string>() { "AllLocations" };         static CacheUtility()         {             foreach (string item in keyNames)             {                 MemCache.Add(item, null);                 MemCacheLocks.Add(item, new object());             }         }         public static T GetFromCacheOrAdd<T>(string cacheKey, Func<object> populateMethod)         {             if (MemCache[cacheKey] == null)             {                 lock (MemCacheLocks[cacheKey])                 {                     if (MemCache[cacheKey] == null)                     {                         MemCache[cacheKey] = populateMethod.Invoke();                     }                 }             }             object cachedItem = MemCache[cacheKey];             if (cachedItem == null)                 throw new Exception("Unable to retrieve item from cache with cacheKey '" + cacheKey + "'");             return (T)cachedItem;         }         public static void RemoveCacheItem(string cacheKey)         {             MemCache[cacheKey] = null;         }         public static void RemoveAllFromCache()         {             foreach (string item in keyNames)             {                 RemoveCacheItem(item);             }         }     } }