我缓存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就无法工作。所以:
它被损坏了吗?Web服务不返回列表中的所有元素?(他们太多了吗?)
发布于 2014-06-10 00:03:53
您必须将返回(列表)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对象不是线程安全的。
https://stackoverflow.com/questions/24135000
复制相似问题