C# .Net企业缓存-立即刷新?
我正在为我的MVC3应用程序使用企业库缓存 我的代码是这样的:C# .Net企业缓存-立即刷新?,c#,asp.net-mvc-3,asp.net-cache,asp.net-caching,C#,Asp.net Mvc 3,Asp.net Cache,Asp.net Caching,我正在为我的MVC3应用程序使用企业库缓存 我的代码是这样的: object myLock = new Object(); public static MyEntity[] getMyEntities() { MyEntity[] res; res = getMyEntities(new GetMyEntitiesRefreshAction()); return res; }
object myLock = new Object();
public static MyEntity[] getMyEntities()
{
MyEntity[] res;
res = getMyEntities(new GetMyEntitiesRefreshAction());
return res;
}
private class GetMyEntitiesRefreshAction : ICacheItemRefreshAction
{
public void Refresh(string removedKey, object expiredValue, CacheItemRemovedReason removalReason)
{
getMyEntitiesInCache(this);
}
}
private static MyEntity[] getMyEntitiesInCache(ICacheItemRefreshAction action)
{
ICacheManager defaultCache = EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>();
MyEntity[] result;
lock (myLock)
{
if ((result = defaultCache.GetData("myEntities") as MyEntity[]) == null)
{
using (EntityContext _entities = new EntityContext())
{
res = _entities.MyEntity
.Include("A.B.C")
.Include("A.B.D")
.Include("A.B.E")
.Include("A.B.F.G")
.Include("A.B.H.I.J")
.Include("A.B.K.L")
.Include("A.B.K.M")
.Include("A.B.N.O")
.Where(x => x.Active && x.Type == 1).ToArray();
//this query takes 20 seconds or more
}
defaultCache.Add("myEntities", result, CacheItemPriority.High, action, new AbsoluteTime(new TimeSpan(0, 1, 0)));
}
}
return result;
}
object myLock=new object();
公共静态MyEntity[]GetMyEntity()
{
MyEntity[]res;
res=getMyEntities(新的GetMyEntitiesRefreshAction());
返回res;
}
私有类GetMyEntityRefreshAction:ICacheItemRefreshAction
{
公共无效刷新(字符串removedKey、对象expiredValue、CacheItemRemovedReason removalReason)
{
getMyEntitiesInCache(此);
}
}
私有静态MyEntity[]GetMyEntityInCache(ICacheItemRefreshAction操作)
{
ICacheManager defaultCache=EnterpriseLibraryContainer.Current.GetInstance();
MyEntity[]结果;
锁(myLock)
{
if((result=defaultCache.GetData(“myEntities”)作为MyEntity[])==null)
{
使用(EntityContext\u entities=new EntityContext())
{
res=_entities.MyEntity
.包括(“A.B.C”)
.包括(“A.B.D”)
.包括(“A.B.E”)
.包括(“A.B.F.G”)
.包括(“A.B.H.I.J”)
.包括(“A.B.K.L”)
.包括(“A.B.K.M”)
.包括(“A.B.N.O”)
.Where(x=>x.Active&&x.Type==1).ToArray();
//此查询需要20秒或更长时间
}
Add(“myEntities”,result,CacheItemPriority.High,action,newAbsoluteTime(newTimeSpan(0,1,0));
}
}
返回结果;
}
因此,当有人调用getMyEntities并缓存元素时,没有问题。但是,当元素过期或加载到缓存中时,用户必须等待很长时间才能看到一些结果。
有没有一种方法可以随时归还一些东西?如果我正在执行查询,我希望返回过期的对象,这样用户就不必等待,当查询完成时,我只保留新的结果。
有什么想法吗