⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expirationtask.cs

📁 HeyCacher 高性能缓存方案(带源码) 1. 文件的所有权益归上传用户所有 2. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途 3. CSDN下载频道仅提供交流平台
💻 CS
字号:
//===============================================================================
// CSDN HeyCache 
//===============================================================================
// 修改记录:[按最后修改时间倒排序]
// 2007.06.11 by tangwei
//
// 代码来源:参考于dotnet企业库3.0版
//===============================================================================
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Threading;

namespace HeyCacher.Components.Scavenger
{
    /// <summary>
    /// 失效清理任务执行器
    /// </summary>
    public class ExpirationTask
    {
        private ICacheOperations cacheOperations;

        /// <summary>
        /// Initialize an instance of the <see cref="ExpirationTask"/> class with an <see cref="ICacheOperations"/> object.
        /// </summary>
        /// <param name="cacheOperations">An <see cref="ICacheOperations"/> object.</param>
        /// <param name="instrumentationProvider">An instrumentation provider.</param>
        public ExpirationTask(ICacheOperations cacheOperations)
        {
            this.cacheOperations = cacheOperations;
        }

        /// <summary>
        /// Perform the cacheItemExpirations.
        /// </summary>
        public void DoExpirations()
        {
            Hashtable liveCacheRepresentation = cacheOperations.CurrentCacheState;
            MarkAsExpired(liveCacheRepresentation);
            PrepareForSweep();
            int expiredItemsCount = SweepExpiredItemsFromCache(liveCacheRepresentation);
        }

        /// <summary>
        /// Mark each <see cref="CacheItem"/> as expired. 
        /// </summary>
        /// <param name="liveCacheRepresentation">The set of <see cref="CacheItem"/> objects to expire.</param>
        /// <returns>
        /// The number of items marked.
        /// </returns>
        public virtual int MarkAsExpired(Hashtable liveCacheRepresentation)
        {
            int markedCount = 0;
            bool LockFlag;
            foreach (ExpirationItem cacheExpirationItem in liveCacheRepresentation.Values)
            {
                try
                {
                    //独占锁
                    do
                    {
                        LockFlag = Monitor.TryEnter(cacheExpirationItem);
                        if (!LockFlag)
                        {
                            Thread.Sleep(0);
                        }
                    }
                    while (!LockFlag);

                    //操作
                    if (cacheExpirationItem.HasExpired())
                    {
                        markedCount++;
                        cacheExpirationItem.WillBeExpired = true;
                    }

                    //释放锁
                    Monitor.Exit(cacheExpirationItem);
                }
                catch(Exception ex)
                {
                    //错误,路径不对,无法建立
                    Caches.log.Error("回收器在标记ExpirationItem中的每个失效策略是否达到条件时发生了一个未知错误", ex);
                }
            }

            return markedCount;
        }

        /// <summary>
        /// Sweep and remove the <see cref="CacheItem"/>s.
        /// </summary>
        /// <param name="liveCacheRepresentation">
        /// The set of <see cref="CacheItem"/> objects to remove.
        /// </param>
        public virtual int SweepExpiredItemsFromCache(Hashtable liveCacheRepresentation)
        {
            int expiredItems = 0;

            foreach (ExpirationItem cacheItem in liveCacheRepresentation.Values)
            {
                if (RemoveItemFromCache(cacheItem))
                    expiredItems++;
            }

            return expiredItems;
        }

        /// <summary>
        /// Prepare to sweep the <see cref="CacheItem"/>s.
        /// </summary>
        public virtual void PrepareForSweep()
        {
        }

        private bool RemoveItemFromCache(ExpirationItem itemToRemove)
        {
            bool expired = false;

            //独占锁
            bool LockFlag;
            do
            {
                LockFlag = Monitor.TryEnter(itemToRemove);
                if (!LockFlag)
                {
                    Thread.Sleep(0);
                }
            }
            while (!LockFlag);

            //操作
            if (itemToRemove.WillBeExpired)
            {
                try
                {
                    expired = true;
                    cacheOperations.RemoveItemFromCache(itemToRemove.Key, CacheItemRemovedReason.Expired);
                }
                catch (Exception ex)
                {
                    //错误,路径不对,无法建立
                    Caches.log.Error("回收器在发现一个缓存过期后,调用相关的remove方法进行删时候发生了错误。", ex);
                }
            }
            
            //释放锁
            Monitor.Exit(itemToRemove);

            //返回
            return expired;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -