ASP.. NET缓存问题

本文关键字:问题 缓存 NET ASP | 更新日期: 2023-09-27 18:07:47

我缓存MyData以避免不必要的调用web服务,但似乎有一些问题。缓存可能工作正常,但我未能找出导致问题的原因。这就是我缓存数据的方式。我使用静态缓存助手。如果你需要这段代码,你可以谷歌一下"缓存助手c#"。

     private static object locker = new object();
    private static List<SomeDataDto> myData;
    private static List<SomeDataDto> MyData{
        get{
            if (CacheHelper.Exists("MyData") == false){
                lock (locker){
                    if (CacheHelper.Exists("MyData") == true){
                        myData=(List<SomeDataDto>)CacheHelper.GetCacheObject("MyData");
                    }
                    else
                    if (CacheHelper.Exists("MyData") == false){
                        var myData = GetSomethingFromDatabase("en", true);
                    CacheHelper.Add(myData, "MyData", 360);
                }
            }
            }
            return (List<SomeDataDto>)CacheHelper.GetCacheObject("MyData");
        }
    }

我在我的页面上调用这个方法,这个方法抛出错误(有时!)

  public SomeObjectToReturn GetOneItem(string language, string id)
    {
        return MyData.Where(x => x.Language == language.ToUpper()).SelectMany(x => x.Something).SelectMany(x => x.SomethingElse).Where(x => x.ID == id).FirstOrDefault();
    }

我为15个不同的id调用这个方法15次,但它适用于10项或8项或类似的东西。如果我编辑配置删除缓存一些其他id-s不工作。所以:

  1. 第一次工作id=6
  2. 第二次不工作id=6

缓存损坏了吗?Web服务不返回列表中的所有元素?(太多了?)

ASP.. NET缓存问题

你必须包含你的return (List)CacheHelper.GetCacheObject("MyData");在你的锁里像:

    get{
        lock (locker){
           if (CacheHelper.Exists("MyData") == false){
                if (CacheHelper.Exists("MyData") == true){
                    myData=(List<SomeDataDto>)CacheHelper.GetCacheObject("MyData");
                }
                else
                if (CacheHelper.Exists("MyData") == false){
                    var myData = GetSomethingFromDatabase("en", true);
                CacheHelper.Add(myData, "MyData", 360);
            }
          }
         return (List<SomeDataDto>)CacheHelper.GetCacheObject("MyData");
       }
    }

如果您在写入或删除时读取,则行为可能与您期望的不同。List对象不是线程安全的