/// <summary> /// 캐시 데이터 불러오기 /// 데이터가 없는 경우 Loader 함수를 통하여 데이터 생성 및 저장 /// </summary> /// <typeparam name="T">반환 타입</typeparam> /// <param name="key">캐시 키</param> /// <param name="loader">데이터를 불러오는 로직</param> /// <param name="cacheTime">캐싱 시간</param> /// <returns>반환 결과</returns> public T Get <T>(string key, CacheDataLoader <T> loader, TimeSpan cacheTime) where T : class { SemaphoreSlim locker = GetLocker(key, cacheTime); T data = null; if (locker.Wait(LockTimeout)) { try { data = Get <T>(key); if (data == null) { data = loader(); if (CacheDataValidator(data)) { Set(key, data, cacheTime); } } } catch { } finally { locker.Release(); } } else { string lockerKey = GetLockerKey(key); if (locker.Equals(Get <SemaphoreSlim>(lockerKey))) { Remove(lockerKey); } } return(data); }