2013-03-22 56 views
0

我有一个存储使用60分钟的客户列表HttpRuntime.Cache WCF服务System.Web.Cache和HttpRuntime.Cache内存位置

如果您运行下面为什么字符串包含在“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"); 
    } 

我期望:

第1次轮:字符串对象为空,因此创建了“字符串1”和“字符串2”且将其缓存

第二牛逼ime round:将字符串拉出缓存,并添加'string3'

第3轮:将字符串拉出缓存,但在再次添加'string3'之前,它已经获得了它。

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

如果我提前

+0

它应该像你期望的一样。它没有的原因不在于这个问题...你如何测试这个代码?在循环中运行3次? – usr 2013-03-22 12:22:42

+0

不,我已将它复制到干净的网站并将其放入网页加载中。并打F5 3次 – user1829226 2013-03-22 12:54:06

回答

0

运行代码其他时间我会得到另一个“STRING3”等

感谢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变量)完成的更改将被“存储”在缓存中而不会重新添加。