【发布时间】:2017-07-20 23:56:29
【问题描述】:
我在 Microsoft.Extensions.Caching.Memory.MemoryCache 中设置了具有滑动到期的缓存项。 我想在每次缓存项过期时触发回调,但是直到我在缓存中查询过期缓存项时才会触发回调。
代码如下:
using System;
using Microsoft.Extensions.Caching.Memory;
namespace Memcache
{
public class Program
{
private static MemoryCache _cache;
private static int _cacheExpSecs;
public static void Main(string[] args)
{
_cache = new MemoryCache(new MemoryCacheOptions());
_cacheExpSecs = 2;
var cacheEntryOptions = new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromSeconds(_cacheExpSecs))
.RegisterPostEvictionCallback(callback: EvictionCallback);
_cache.Set(1, "One", cacheEntryOptions);
_cache.Set(2, "Two", cacheEntryOptions);
var autoEvent = new System.Threading.AutoResetEvent(false);
System.Threading.Timer timer = new System.Threading.Timer(checkCache, autoEvent, 1000, 6000);
Console.Read();
}
private static void checkCache(Object o)
{
if(_cache.Get(1)!=null)
{
Console.WriteLine(string.Format(@"checkCache: Cache with key {0} will be removed manually and will trigger the callback.", 1));
_cache.Remove(1);
}
else
{
Console.WriteLine(string.Format("checkCache: Cache with key {0} is expired.", 1));
}
if(_cache.Get(2) != null)
{
Console.WriteLine(string.Format("checkCache: Cache with key {0} will expire in {1} seconds, but won't trigger the callback until we check it's value again.", 2, _cacheExpSecs));
}
else
{
Console.WriteLine(string.Format("checkCache: Cache with key {0} is expired.", 2));
}
}
private static void EvictionCallback(object key, object value, EvictionReason reason, object state)
{
Console.WriteLine();
Console.WriteLine("/*****************************************************/");
Console.WriteLine(string.Format("/* EvictionCallback: Cache with key {0} has expired. */", key));
Console.WriteLine("/*****************************************************/");
Console.WriteLine();
}
}
}
【问题讨论】:
标签: .net caching asp.net-core memorycache