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不工作。所以:
- 第一次工作id=6
- 第二次不工作id=6
缓存损坏了吗?Web服务不返回列表中的所有元素?(太多了?)
你必须包含你的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对象不是线程安全的