如何将对象锁定在缓存中,并在尝试检索对象时检查该对象

本文关键字:对象 检索 检查 锁定 缓存 | 更新日期: 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