예제 #1
0
        /// <summary>
        /// Copies the entries of a cache into an array. Used for state transfer.
        /// </summary>
        /// <param name="cache">cache object</param>
        /// <param name="count">number of entries to return</param>
        /// <returns>array of cache entries</returns>
        public static CacheEntry[] GetCacheEntries(CacheBase cache, long count)
        {
            long index = 0;

            CacheEntry[] entArr = null;
            CacheEntry   ent    = null;

            cache.Sync.AcquireReaderLock(Timeout.Infinite);
            try
            {
                if (count == 0 || count > cache.Count)
                {
                    count = cache.Count;
                }
                entArr = new CacheEntry[count];
                IDictionaryEnumerator i = cache.GetEnumerator();
                while (index < count && i.MoveNext())
                {
                    ent             = i.Value as CacheEntry;
                    entArr[index++] = ent.RoutableClone(null);
                }
            }
            catch (Exception e)
            {
                cache.Context.NCacheLog.Error("CacheHelper.CreateLocalEntry()", e.Message);
                return(null);
            }
            finally
            {
                cache.Sync.ReleaseReaderLock();
            }
            return(entArr);
        }
예제 #2
0
파일: MiscUtil.cs 프로젝트: nonomal/NCache
        /// <summary>
        /// Returns an array containing list of keys contained in the cache. Null if there are no
        /// keys or if timeout occurs.
        /// </summary>
        /// <param name="cache"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        internal static object[] GetKeyset(CacheBase cache, int timeout)
        {
            int index = 0;

            object[] objects = null;
            cache.Sync.AcquireWriterLock(timeout);
            try
            {
                if (!cache.Sync.IsWriterLockHeld || cache.Count < 1)
                {
                    return(objects);
                }
                objects = new object[cache.Count];

                for (IEnumerator i = cache.GetEnumerator(); i.MoveNext() && index < objects.Length;)
                {
                    objects[index++] = ((DictionaryEntry)i.Current).Key;
                }
            }
            finally
            {
                cache.Sync.ReleaseWriterLock();
            }
            return(objects);
        }