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

时间:2015-09-15 13:55:03

标签: c# asp.net asp.net-mvc entity-framework caching

为了提高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;

我的问题是,在处理请求时,系统中的这些对象将被修改,因此如果多个用户同时尝试访问缓存,他们可能会相互覆盖,并且会发生错误或者视图生成不正确。

所以我正在寻找一种方法来在访问时将缓存条目标记为使用中,以便缓存仅在填充时使用,而不是在使用时,然后在结束时释放它请求。

1 个答案:

答案 0 :(得分:0)

您可以使用锁定关闭所有线程的访问权限,直到第一个线程无法使用您的缓存。只有在其他线程可以访问您的缓存之后。

有关它的更多信息:

How does lock work exactly?

https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

http://www.codeproject.com/Tips/788402/Monitor-and-Lock-in-Csharp