/// <summary>
        /// 从内部缓存获取一个内存表
        /// </summary>
        /// <param name="key">key</param>
        /// <returns>table</returns>
        internal TMemoryTable Get(TKey key)
        {
            GetByKey <TKey, TMemoryTable> getByKey = GetMemoryTableByKey;
            TMemoryTable memoryTable = cache.GetWithAdd(key, getByKey);

            return(memoryTable);
        }
Esempio n. 2
0
        /// <summary>
        /// 根据key获取value,当获取不到时,通过getBykey方法获取value,并插入缓存,
        /// 同时返回给调用者
        /// </summary>
        /// <param name="key">key</param>
        /// <param name="getByKey">GetByKey类型的方法委托</param>
        /// <returns>value</returns>
        public V GetWithAdd(K key, GetByKey <K, V> getByKey)
        {
            cacheLock.EnterUpgradeableReadLock();
            V result;

            try
            {
                if (innerCache.ContainsKey(key))
                {
                    result = innerCache[key];
                }
                else
                {
                    result = getByKey(key);
                    if (result != null)
                    {
                        cacheLock.EnterWriteLock();
                        try
                        {
                            innerCache[key] = result;
                        }
                        finally
                        {
                            cacheLock.ExitWriteLock();
                        }
                    }
                }
            }
            finally
            {
                cacheLock.ExitUpgradeableReadLock();
            }

            return(result);
        }