我有一个缓存方法如下: -
修改
// Cache Methods
public void dbcTvShowsList(ref List<TvShow> listTvShows, ref Int16 err)
{
// Check to see if tv shows are already in cache
if (HttpRuntime.Cache["TvShows"] != null)
{
listTvShows = (List<TvShow>)HttpRuntime.Cache["TvShows"];
// Make sure we have data in the list
if (listTvShows.Count == 0)
{
// No data in the list. Read it from the database
// Now cache the data
}
else
{
// Now cache the data
HttpRuntime.Cache.Insert("TvShows", listTvShows, null, DateTime.Now.AddMinutes(3), System.Web.Caching.Cache.NoSlidingExpiration);
}
}
else
{
// Data no longer in cache. Read it from the database
// If we got data, cache it
if (err == 0)
{
HttpRuntime.Cache.Insert("TvShows", listTvShows, null, DateTime.Now.AddMinutes(3), System.Web.Caching.Cache.NoSlidingExpiration);
}
}
}
现在在我的课堂上,我正在阅读缓存数据,然后对其进行一些更改。但这会影响我的缓存数据,如下所示: -
new iNGRID_Data.TvShows.DataMethods().dbcTvShowsList(ref _TvShows, ref err);
TvShow TvShowAll = new TvShow();
TvShowAll.ShowId = 0;
TvShowAll.ShowName = "All Programming";
_TvShows.Add(TvShowAll);
这会修改全局缓存并将All Programming添加到其中。
你能告诉我为什么会这样吗?
此致 阿布舍克巴克
答案 0 :(得分:1)
因为您通过ref
关键字传递了列表。您没有使用列表的本地/新副本,而是对您传入的列表的引用。不确定为什么ref
在这里甚至需要诚实。
此外,您的逻辑和评论似乎有点偏离:
// Make sure we have data in the list
if (listTvShows.Count == 0)
{
// No data in the list. Read it from the database
}
else
{
// Now cache the data
HttpRuntime.Cache.Insert("TvShows", listTvShows, null, DateTime.Now.AddMinutes(3), System.Web.Caching.Cache.NoSlidingExpiration);
}
您检查是否有数据,如果没有从数据库中获取但未将其插入缓存(可能是)。
然后在你的其他地方,你声明你将数据插入缓存,为什么?该代码的作用实质上是将数据插入缓存(如果已存在)。当然你想要与此相反吗? E.g。
if(listTvShows.Count == 0)
{
//fetch from db
//insert into cache
}
//no need for an else, do whatever you need with the data