我正在缓存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无效。 所以:
缓存是否已损坏? Web Service不返回列表中的所有元素? (他们太多了?)
答案 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对象不是线程安全的。