public static class CacheHelper { static object _lockObj = new object(); private static Dictionary<string, object> _lockObjDict = new Dictionary<string, object>(); /// <summary> /// 获取缓存,如果缓存不存在,则从 acquire 里获取 /// 但是如果 acquire 得到的是 null,则不保存入缓存 /// </summary> /// <typeparam name="TResult">缓存类型</typeparam> /// <param name="cacheProvider">缓存Provider</param> /// <param name="key">缓存Key</param> /// <param name="second">缓存时间</param> /// <param name="acquire">acquire</param> /// <returns>null或者缓存实例</returns> public static TResult GetBySeconds<TResult>( this ICacheProvider cacheProvider, string key, int second, Func<TResult> acquire) { ////缓存key不能为空,但是可以为空字符串 if (key == null) { throw new ArgumentNullException("参数key不能为空"); } if (!_lockObjDict.ContainsKey(key)) { lock (_lockObj) { if (!_lockObjDict.ContainsKey(key)) { _lockObjDict.Add(key, new object()); } } } ////如果当前缓存存在则直接返回 if (cacheProvider.IsSet(key)) { return cacheProvider.Get<TResult>(key); } lock (_lockObjDict[key]) { //再次检测当前缓存存在则直接返回 if (cacheProvider.IsSet(key)) { return cacheProvider.Get<TResult>(key); } ////如果不存在则调用获取方法 var result = acquire(); ////如果获取到的结果为空,则不缓存 if (result != null) { cacheProvider.Set(key, result, second); } return result; } } }