对缓存更改列表对象c#的更改

时间:2013-12-17 10:27:32

标签: c# asp.net-mvc-3 caching

我有一个缓存方法如下: -

修改

    // 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添加到其中。

你能告诉我为什么会这样吗?

此致 阿布舍克巴克

1 个答案:

答案 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