如何将对象锁定在缓存中,并在尝试检索对象时检查该对象
本文关键字:对象 检索 检查 锁定 缓存 | 更新日期: 2023-09-27 18:12:45
为了提高我的ASP的性能。我正在缓存实体的集合。
下面是一些检查缓存是否被填充的代码,如果是,则在执行"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;
我的问题是,当处理请求时,集合中的这些对象将被修改,所以如果多个用户试图同时访问缓存,他们可能会相互覆盖,错误将发生或视图将不正确地生成。
所以我正在寻找一种方法来标记缓存条目为在使用访问时,以便缓存仅在填充而不使用时使用,然后在请求结束时释放它。
您可以使用lock关闭所有线程的访问,直到第一个线程没有完成对缓存的处理。只有在此之后,其他线程才能访问你的缓存。
更多信息在这里:
锁到底是怎么工作的?
https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx http://www.codeproject.com/Tips/788402/Monitor-and-Lock-in-Csharp