C# 在asp.net中,如何在构建新缓存时为旧缓存提供服务?

C# 在asp.net中,如何在构建新缓存时为旧缓存提供服务?,c#,asp.net,caching,C#,Asp.net,Caching,通常在缓存超时后,缓存被清空,下一个请求将再次建立缓存,导致响应时间非常可变。在asp.net(我使用的是4.0)中,在构建新缓存时,为旧缓存提供服务的最佳方式是什么 我正在使用HttpRuntime.Cache我找到了一个似乎运行良好的解决方案。它基于另一个 内存缓存中的公共类:ICacheService { public T Get(字符串键,DateTime?expirationTime,Func fetchDataCallback),其中T:class { T item=HttpRunt

通常在缓存超时后,缓存被清空,下一个请求将再次建立缓存,导致响应时间非常可变。在asp.net(我使用的是4.0)中,在构建新缓存时,为旧缓存提供服务的最佳方式是什么


我正在使用HttpRuntime.Cache

我找到了一个似乎运行良好的解决方案。它基于另一个

内存缓存中的公共类:ICacheService
{
public T Get(字符串键,DateTime?expirationTime,Func fetchDataCallback),其中T:class
{
T item=HttpRuntime.Cache.Get(key)作为T;
如果(项==null)
{
item=fetchDataCallback();
HttpRuntime.Cache.Insert(key,item,null,expirationTime→DateTime.Now.AddMinutes(10),TimeSpan.Zero,CacheItemPriority.Normal(
s、 价值、理由)=>
{
//重新缓存旧数据,以便用户在提取新数据时接收旧缓存
HttpRuntime.Cache.Insert(key,value,null,DateTime.Now.AddMinutes(10),TimeSpan.Zero,CacheItemPriority.Normal,null);
//异步获取数据并再次插入缓存
Task.Factory.StartNew(()=>HttpRuntime.Cache.Insert(key,fetchDataCallback(),null,expirationTime??DateTime.Now.AddMinutes(10),TimeSpan.Zero,CacheItemPriority.Normal,null));
});
}
退货项目;
}
}
public class InMemoryCache : ICacheService
{
    public T Get<T>(string key, DateTime? expirationTime, Func<T> fetchDataCallback) where T : class
    {
        T item = HttpRuntime.Cache.Get(key) as T;
        if (item == null)
        {
            item = fetchDataCallback();
            HttpRuntime.Cache.Insert(key, item, null, expirationTime ?? DateTime.Now.AddMinutes(10), TimeSpan.Zero, CacheItemPriority.Normal, (
                s, value, reason) =>
                {
                    // recache old data so that users are receiving old cache while the new data is being fetched
                    HttpRuntime.Cache.Insert(key, value, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero, CacheItemPriority.Normal, null);

                    // fetch data async and insert into cache again
                    Task.Factory.StartNew(() => HttpRuntime.Cache.Insert(key, fetchDataCallback(), null, expirationTime ?? DateTime.Now.AddMinutes(10), TimeSpan.Zero, CacheItemPriority.Normal, null));
                });
        }
        return item;
    }
}