Esempio n. 1
0
        /// <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);
        }