为了提高ASP.Net网站的性能,我正在缓存实体集合。
下面是一些检查缓存是否已填充的代码,如果是,则在执行" CacheClean"之后返回集合。它会重置某些属性,因此即使从另一个请求修改它们,它们也会被重置。 如果没有,则运行实体查询并设置缓存。
MemoryCache cache = MemoryCache.Default;
List<MyControl> controlList = cache["ControlListByType" + TypeId] as List<MyControl>;
if (controlList == null)
{
myDbContext.Configuration.ProxyCreationEnabled = false;
myDbContext.Configuration.LazyLoadingEnabled = false;
controlList = myDbContext.MyControls.AsNoTracking()
.Include(c => c.ControlComboBoxes)
.Include(c => c.ControlComments)
.Include(c => c.ControlItems)
.Include(c => c.ControlType)
.Include(c => c.ControlUploads)
.Where(c => c.TypeId == TypeId).OrderBy(c => c.Position)
.ToList();
cache["ControlListByType" + TypeId] = controlList;
}
else
controlList.ForEach(c => c.CacheClean());
return controlList;
我的问题是,在处理请求时,系统中的这些对象将被修改,因此如果多个用户同时尝试访问缓存,他们可能会相互覆盖,并且会发生错误或者视图生成不正确。
所以我正在寻找一种方法来在访问时将缓存条目标记为使用中,以便缓存仅在填充时使用,而不是在使用时,然后在结束时释放它请求。
答案 0 :(得分:0)
您可以使用锁定关闭所有线程的访问权限,直到第一个线程无法使用您的缓存。只有在其他线程可以访问您的缓存之后。
有关它的更多信息:
https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx
http://www.codeproject.com/Tips/788402/Monitor-and-Lock-in-Csharp