Ejemplo n.º 1
0
        // autoLock 防止Cache失效的时候,大量请求Cache对象,重复调用Load使得服务器彻底失效
        public static T GetOrDefault <T>(string key, Func <T> loadFunc, int lifeTimeSeconds = CahceTimeDefault, bool autoLock = true) where T : class
        {
            T obj = cacheProvider.GetCachedObject(key) as T;

            if (null == obj)
            {
                if (autoLock)
                {
                    using (var l = cacheProvider.AcquireLock(key)) {
                        // re read,多线程环境下,如果第一次读取失败
                        // 每个线程都会call load Func,所以会引起内存失效崩溃
                        // 现在的代码只会有一个线程call对应的loadFunc
                        obj = cacheProvider.GetCachedObject(key) as T;
                        if (null != obj)
                        {
                            return(obj);
                        }
                        obj = loadFunc();
                        cacheProvider.SetCachedObject(key, obj, lifeTimeSeconds);
                    }
                }
                else
                {
                    obj = loadFunc();
                    cacheProvider.SetCachedObject(key, obj, lifeTimeSeconds);
                }
            }
            return(obj);
        }