ASP.NET缓存问题

时间:2014-06-10 07:14:13

标签: c# asp.net web-services caching

我正在缓存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-s称呼此方法15次,但它适用于10个项目或8个项目或类似的东西。如果我编辑配置以删除缓存,则其他一些id-s无效。 所以:

  1. 第一次使用id = 6
  2. 第二次不起作用id = 6
  3. 缓存是否已损坏? Web Service不返回列表中的所有元素? (他们太多了?)

1 个答案:

答案 0 :(得分:0)

你必须包含你的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对象不是线程安全的。