C# 通过.NET MemoryCache中的CacheItemPolicy使缓存项过期

C# 通过.NET MemoryCache中的CacheItemPolicy使缓存项过期,c#,.net,caching,C#,.net,Caching,我对CacheItemPolicy上的AbsoluteExpiration属性感到困惑 表示“清除缓存项之前必须经过的时间段”。它使用System.DateTimeOffset定义“时间段” 但如果你看一下,它说它“代表了一个时间点……相对于协调世界时(UTC)。”也参考这个 你看到问题了吗?AbsoluteExpiration需要一个“时间段”(如5秒或2小时),但它需要一个表示“时间点”的对象(如2012年12月21日06:14:00 EST) 在下面的代码中,我为所有项目定义了一个策略。我

我对CacheItemPolicy上的AbsoluteExpiration属性感到困惑

表示“清除缓存项之前必须经过的时间段”。它使用System.DateTimeOffset定义“时间段”

但如果你看一下,它说它“代表了一个时间点……相对于协调世界时(UTC)。”也参考这个

你看到问题了吗?AbsoluteExpiration需要一个“时间段”(如5秒或2小时),但它需要一个表示“时间点”的对象(如2012年12月21日06:14:00 EST)

在下面的代码中,我为所有项目定义了一个策略。我希望每个项目在添加后的几秒钟内过期。有人能证明我的方法是正确的吗

public class MyCache : IRoutingInfoCache
{
    MemoryCache _routingInfoCache;
    CacheItemPolicy _cachePolicy;


    public MyCache(int cacheExpiryInSeconds)
    {
        _routingInfoCache = new MemoryCache("myCache");
        _cachePolicy = new CacheItemPolicy() {
            AbsoluteExpiration = 
                new DateTimeOffset(
                    DateTime.UtcNow.AddSeconds(cacheExpiryInSeconds))
        };
    }


    public void Put(string key, object cacheItem)
    {
        // based on how I constructed _cachePolicy, will this item expire
        // in cacheExpiryInSeconds seconds?
        _routingInfoCache.Add(new CacheItem(key, cacheItem), _cachePolicy);
    }
}

缓存遵循UTC时间,以提供统一的时间计算,因此您可以指定缓存项到期的时间点(UTC),缓存将计算从现在开始的适当差异,并按预期到期


您的代码将无法按预期工作,因为您的绝对过期时间将
cacheExpiryInSeconds
seconds过去一次输入缓存项之前,导致立即退出。如果在不久的将来设置了AbsoluteExpiration,则无法共享CacheItemPolicy实例,我知道这很烦人。:)

但是,如果我创建了一个缓存策略(使用上面的代码)/每次/I添加一个项,那么它应该按照预期工作,对吗?是的,准确地说!或者,如果您更灵活一点,请保留CacheItemPolicy的共享实例,并使用N秒的SlidingExpiration。我明确不希望每次访问一个项目时“重置时钟”,因此我认为AbsoluteExpiration适合我。不过,谢谢你提到它。有一件事可能会让你感觉更好,那就是CacheItemPolicy是一个结构,所以每次调用都创建它非常便宜。@DavidHaney“不久的将来”是什么意思?这能解释我在这里看到的行为吗?