System.Web.Cache和HttpRuntime.Cache内存位置

时间:2013-03-22 12:19:06

标签: c# caching

我有一个WCF服务,使用HttpRuntime.Cache存储60分钟的客户列表

如果你运行以下内容,为什么字符串第三次包含'string3'

  string mykey = "mykey-1";
    List<string> strings = null;

    strings = HttpRuntime.Cache[mykey] as List<string>;

    if (strings == null)
    {
        strings = new List<string>();
        strings.Add("string1");
        strings.Add("string2");
        HttpRuntime.Cache[mykey] = strings;
    }
    else
    {
        strings.Add("string3");
    }

我希望:

第一轮:字符串对象为null,因此创建了'string1'和'string2'并且它已缓存

第二轮:字符串从缓存中拉出,并添加了'string3'

第三轮:字符串从缓存中拉出,但在你再次添加'string3'之前它已经得到了它。

是共享内存还是应用程序池中的内容。如果你将它从缓存中取出然后更改它,它就会更改缓存版本而不必重新添加它。

如果我再次运行代码,我将获得另一个'string3'等

提前致谢

1 个答案:

答案 0 :(得分:0)

List<string>类是引用类型。这意味着您可以拥有多个引用同一实例的变量。如果使用其中一个变量更改某些内容,则更改也将通过其他变量可见,因为它们实际上都引用了相同的对象/实例。

在您的示例中,在第一个请求中创建List<string>的新实例,向其中添加一些字符串,然后将其添加到缓存中。因此,在第一次请求之后,HttpRuntime.Cache对象将保存对已创建的List<string>实例的引用。

在第二个请求中,您可以将List<string的此实例的引用分配给strings变量。因此strings引用在第一个请求中创建的实例。并且HttpRuntime.Cache仍然持有对同一实例的引用。然后,再向列表中添加一个字符串。 List<string>的一个实例在内存中更新以包含新字符串。

在第三次运行中,您再次将对同一实例的引用复制到strings变量。这仍然引用在第一个请求中创建的完全相同的实例,稍后在第二个请求中进行修改。因此,在第三个请求中,它已包含string3值。由于List<string>可以愉快地包含具有相同值的多个项目,因此第三个请求会将另一个项目添加到值为string3的列表中。等等之后的进一步请求。

你写了

  

是共享内存还是应用程序池中的内容。哪个,如果你   将它拉出缓存然后更改它,它会更改缓存版本   无需重新添加。

当你执行strings = HttpRuntime.Cache[mykey] as List<string>;时,你并没有真正将它从缓存中拉出来。而是要创建对已在缓存中引用的内容的引用。

所以答案是肯定的,通过本地引用(= strings变量)完成的更改将“存储”在缓存中而无需重新添加。