0

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

如果您运行以下内容,为什么字符串在第 3 次包含“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");
    }

我希望:

第一轮:字符串对象为空,因此添加了“string1”和“string2”并将其缓存

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

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

它是共享内存还是应用程序池中的东西。如果您将其从缓存中拉出然后更改它,它会更改缓存版本而无需重新添加它。

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

提前致谢

4

1 回答 1

0

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

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

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

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

你写了

它是共享内存还是应用程序池中的东西。如果您将其从缓存中拉出然后更改它,它会更改缓存版本而无需重新添加它。

当你这样做时,你并strings = HttpRuntime.Cache[mykey] as List<string>;没有真正把它从缓存中拉出来。相反,您正在创建对缓存中已引用的内容的引用。

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

于 2013-03-22T13:46:13.867 回答