📄 expirationtask.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 + -