|
6
|
| Schleichermann · 技术社区 · 16 年前 |
|
|
1
5
根据反射镜,
您说您将对缓存的调用包装在自己的singleton对象中。你为什么这么做?
|
|
|
2
0
关于发生这种缓存异常的环境的更多细节。 我有一个ASP.NET用户控件,它表示页面上的选项卡式容器。此控件包含用户选择的主题列表。对于每个主题,用户已选择此控件为该主题创建一个新选项卡,其中包含与该主题相关的文档。 控件使用ASP.NET提供的LoadControl方法创建新选项卡。然后,它从新创建的选项卡控件的列表中分配一个主题。每个选项卡控件都知道如何为其分配的主题定位文档。 它在实现缓存的这个选项卡控件中。用于缓存文档列表的缓存键对于查看主题的用户的站点+主题+性别+年龄是完全唯一的。这允许所有符合该条件的用户在整个站点缓存和检索文档列表。 当文档列表被传递到缓存时,它们被常规的旧对象引用(即list documents=\u documents)传递。但当从缓存中提取时,列表是空的。 尽管每个选项卡控件都是同一用户控件的自己的实例,并且在选项卡控件中使用的所有变量都是该控件的私有变量,并且应该特定于该控件。我走到了尽头,尽管每个选项卡都无法重写彼此的私有列表,但我还是决定要发生某种疯狂的引用错误,如果是这样的话,我需要停止在缓存中使用引用的对象,只将新的列表副本发送给缓存。尝试存储。 然后,我对列表使用了以下扩展方法,并在将每个列表传递到缓存时克隆它们。这使得传递到缓存的所有项都是全新的对象,它们在内存中有自己的空间,并且对该内存有自己独特的引用。 修理它。缓存现在可以工作了。现在返回的列表与添加到缓存的列表完全相同。我不知道为什么这会有什么不同,如果有人有任何想法,我很想听到他们。
|
|
|
3
0
缓存通常不会序列化或克隆您放入其中的对象。它们只是将一个键与您传入的对象相关联。而且由于列表是引用类型,所以当使用键从缓存中检索时,对列表所做的任何更改都将可见。所以我猜你是在插入列表后从列表中删除项目。这就是“插入时克隆”解析它的原因。 |